我有一个定义一些字段,所有(或至少大部分)其他实体应该有一些基本的实体。看起来像:
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_”和查询得到,当然失败。
不知道如何解决这个问题?如何告诉所有的成员都属于同一个表,即使它们属于两个实体类奏鸣曲?
发现这个问题。要在定义基础机构开始我有:
/**
* @ORM\Entity()
* @ORM\MappedSuperclass
* @ORM\HasLifecycleCallbacks()
*/
这是因为,“实体()”行不正确。这已被删除。它不能在同一时间实体和映射晚饭类。
/**
* @ORM\MappedSuperclass
* @ORM\HasLifecycleCallbacks()
*/