定义奏鸣曲扩展实体

问题描述 投票:0回答:1

我有一个定义一些字段,所有(或至少大部分)其他实体应该有一些基本的实体。看起来像:

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;
    }

等等... getter和setter方法。

然后,我有延伸的BaseEntity实体即ArticleCategory:

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');
    }
}

问题是,当我去奏鸣曲列表页面,而不是显示在文章分类类型的所有实体,我得到一个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(职称)的所有领域都收集好,与别名。但是,这属于基础类(BaseEntity)奏鸣曲的所有其他领域正试图通过一些非现有别名“b0_”和查询得到,当然失败。

不知道如何解决这个问题?如何告诉所有的成员都属于同一个表,即使它们属于两个实体类奏鸣曲?

sonata-admin symfony4
1个回答
0
投票

发现这个问题。要在定义基础机构开始我有:

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

这是因为,“实体()”行不正确。这已被删除。它不能在同一时间实体和映射晚饭类。

/**
 * @ORM\MappedSuperclass
 * @ORM\HasLifecycleCallbacks()
 */
© www.soinside.com 2019 - 2024. All rights reserved.