我认为你可能误解了,你引用的手册部分标题是“性能影响”,他们并没有告诉你不能这样做,只是在说明如果这样做会有性能方面的影响。 对于惰性加载来说,这是有道理的——对于 STI 实体的异构集合,您必须访问数据库并加载实体,才能知道它将属于哪个类,因此惰性加载不可能/没有意义。 我现在也在学习 Doctrine 2,所以我模拟了你的示例,以下更好地工作:
namespace Entities;
class Pet
{
private $id;
private $name;
private $owner;
}
class Dog extends Pet
{
private $kennels;
}
class Cat extends Pet
{
private $cattery;
}
class User
{
private $id;
private $name;
private $pets;
}
...和测试脚本...
if (false) {
$u = new Entities\User;
$u->setName("Robin");
$p = new Entities\Cat($u, 'Socks');
$p2 = new Entities\Dog($u, 'Rover');
$em->persist($u);
$em->persist($p);
$em->persist($p2);
$em->flush();
} else if (true) {
$u = $em->find('Entities\User', 1);
foreach ($u->getPets() as $p) {
printf("User %s has a pet type %s called %s\n", $u->getName(), get_class($p), $p->getName());
}
} else {
echo " [1]\n";
$p = $em->find('Entities\Cat', 2);
echo " [2]\n";
printf("Pet %s has an owner called %s\n", $p->getName(), $p->getOwner()->getName());
}
我所有的猫和狗都被正确地加载了:
如果你查看生成的 SQL,你会注意到当 OneToMany 的 targetEntity 是 "pet" 时,你会得到以下 SQL:
SELECT t0.id AS id1, t0.name AS name2, t0.owner_id AS owner_id3, pet_type,
t0.cattery AS cattery4, t0.kennels AS kennels5 FROM pets t0
WHERE t0.owner_id = ? AND t0.pet_type IN ('cat', 'dog')
但是当它设置为Cat时,你会得到这个:
SELECT t0.id AS id1, t0.name AS name2, t0.cattery AS cattery3, t0.owner_id
AS owner_id4, pet_type FROM pets t0 WHERE t0.owner_id = ? AND t0.pet_type IN ('cat')
希望对你有所帮助。