我必须遵循设置:父类
/**
* @ORM\Entity()
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string")
*/
abstract class DataCategory
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
//...
}
和几个持有对父级的引用的派生类(这里只显示一个)
/**
* @ORM\Entity
*/
class MultiCompoundDataCategory extends DataCategory
{
/**
* @ORM\ManyToMany(targetEntity="DataCategory", fetch="EXTRA_LAZY")
* @ORM\JoinTable(name="multi_compound_data_category_data_category",
* joinColumns={@ORM\JoinColumn(name="multi_compound_data_category", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="data_category", referencedColumnName="id")})
*/
public $summands;
public function __construct()
{
$this->summands = new ArrayCollection();
}
}
现在,当通过 加载所有 MultiCompoundDataCategories 时
$this->getDoctrine()->getRepository(MultiCompoundDataCategory::class)->findAll()
,不仅在 MultiCompoundDataCategories 上发出一个选择(在 ManyToMany 表上连接)。相反,我得到一个主查询,然后是每个summand 的一个查询,每个查询都有一个大的胖序列LEFT JOIN
(文档也包含有关此问题的警告,我大量引用继承树的非叶节点)。
顺便说一句:LAZY
获取已经足以避免加载 ManyToMany 吗?
从这个评论中,我认为问题是我的子实体引用了父实体。我该如何规避这个?映射超类?