doctrine 2:继承映射与父表

时间:2018-01-16 12:36:21

标签: php mysql symfony doctrine-orm

我有一个这样的基表:

class BaseProduct 
{
    /**
     * @ORM\ManyToOne(targetEntity="ProductBundle\Entity\Category", inversedBy="baseProducts")
     * @ORM\JoinColumn(name="menu_category_id", referencedColumnName="id", nullable=true)
     **/
    protected $category;
// ...

和从BaseProduct继承的另一个实体

class ChildProduct extends BaseProduct
{

    /**
     * @ORM\ManyToOne(targetEntity="ProductBundle\Entity\Category", inversedBy="childProducts")
     * @ORM\JoinColumn(name="menu_category_id", referencedColumnName="id", nullable=true)
     **/
    protected $category;

和类别实体:

class Category 
{
    /**
     * @ORM\OneToMany(targetEntity="ProductBundle\Entity\BaseProduct", mappedBy="category")
     * @ORM\OrderBy({"position"= "ASC"})
     */
    private $baseProducts;

    /**
     * @ORM\OneToMany(targetEntity="ProductBundle\Entity\ChildProduct", mappedBy="category")
     * @ORM\OrderBy({"position"= "ASC"})
     */
    private $childProducts;

我的ChildProduct表格中有一列名为id,并引用了BaseProduct ID' s。现在,我想通过此查询加入带ChildProduct的类别:

    $qb->select('mc', 'cp')
        ->from('ProductBundle:Category', 'mc')
        ->leftJoin('mc.childProducts', 'cp')
        // .....

当我执行此查询时,它会出现此错误:

  

SqlWalker.php第922行中的ContextErrorException:

     

注意:未定义的索引:childProducts

虽然我在类别中有childProducts

现在我有两个问题:

  1. 我可以查询子表中不存在的父字段。
  2. 我的查询有什么问题

1 个答案:

答案 0 :(得分:0)

检查学说章节继承映射:Inheritance Mapping

在文档之后尝试这个(我没有测试代码)

/** @ORM\MappedSuperclass */
class BaseProduct 
{
    /**
      * @ORM\ManyToOne(targetEntity="ProductBundle\Entity\Category", inversedBy="baseProducts")
      * @ORM\JoinColumn(name="menu_category_id", referencedColumnName="id", nullable=true)
     **/
     protected $category;

现在,Doctrine知道你的类是其他人的基类。 您只需要扩展基类并添加注释@ORM\Entity

/**
 * @ORM\Entity()
 **/
class ChildProduct extends BaseProduct
{

    /**
     * @ORM\ManyToOne(targetEntity="ProductBundle\Entity\Category", inversedBy="childProducts")
     * @ORM\JoinColumn(name="menu_category_id", referencedColumnName="id", nullable=true)
    **/
    protected $category;

我认为您可以从ChildProduct $category字段中删除。它也应该有效。