Определение расширенных сущностей в сонате - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть базовый объект, который определяет некоторые поля, которые должны иметь все (или, по крайней мере, большинство) других объектов.Это выглядит так:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;


/**
 * @ORM\Entity()
 * @ORM\MappedSuperclass
 * @ORM\HasLifecycleCallbacks()
 */
abstract class BaseEntity {

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\Column(type="boolean")
     */
    protected $published;

    /**
     * @ORM\Column(type="datetime")
     */
    protected $createdAt;

    /**
     * @ORM\Column(type="datetime")
     */
    protected $updatedAt;



    public function getId(): ?int
    {
        return $this->id;
    }

и так далее ... геттеры и сеттеры.

Тогда у меня есть сущность, т.е. ArticleCategory, расширяющая этот BaseEntity:

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ArticleCategoryRepository")
 */
class ArticleCategory extends BaseEntity
{

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $title;

    public function getTitle(): ?string
    {
        return $this->title;
    }

    public function setTitle(string $title): self
    {
        $this->title = $title;
        return $this;
    }
}

Итак,это просто добавление одного дополнительного поля - заголовка.

Затем у меня есть базовый класс администратора:

namespace App\Admin;

use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use App\Entity\BaseEntity;

class BaseAdmin extends AbstractAdmin
{

    /**
     * @param BaseEntity $entity
     */
    public function prePersist($entity)
    {
        $now = new \DateTime();
        $entity->setCreatedAt($now);
        $entity->setUpdatedAt($now);
        $entity->setPublished(true);
    }
}

И затем класс администратора для этой сущности ArticleCategory:

namespace App\Admin;

use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;

final class ArticleCategoryAdmin extends BaseAdmin
{
    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->add('title', TextType::class);
    }

    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper
            ->add('title');
    }

    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->addIdentifier('title');
    }
}

Проблема в том, что когда я захожу на страницу со списком сонат вместо отображения всех сущностей в типе ArticleCategory, я получаю сообщение об ошибке sql:

Неизвестный столбец 'b0_.id' в 'списке полей'

И запрос выглядит так:

SELECT b0_.id AS id_0, b0_.published AS published_1, b0_.created_at AS created_at_2, b0_.updated_at AS updated_at_3, a1_.title AS title_4 
FROM article_category a1_ 
WHERE a1_.id IN (?, ?) 
ORDER BY a1_.id ASC' with params [2, 3]

Таким образом, соната получает данные из правильной таблицы (article_category) и создает для нее псевдоним "a1_", и все поля, которые находятся непосредственно внутри ArticleCategory (title), являютсясобрал хорошо, с этим псевдонимом.Но все остальные поля, принадлежащие сонате базового класса (BaseEntity), пытаются получить через какой-то несуществующий псевдоним "b0_", и запрос, конечно, не выполняется.

Есть идеи, как решить эту проблему?Как сказать сонате, что все поля принадлежат одной таблице, даже если они принадлежат двум классам сущностей?

1 Ответ

0 голосов
/ 11 февраля 2019

Нашел проблему.В начале, где была определена базовая сущность, у меня было:

/**
 * @ORM\Entity()
 * @ORM\MappedSuperclass
 * @ORM\HasLifecycleCallbacks()
 */

Что неверно из-за этой строки "Entity ()".Это должно было быть удалено.Это не может быть сущность и отображенный класс ужина одновременно.

/**
 * @ORM\MappedSuperclass
 * @ORM\HasLifecycleCallbacks()
 */
...