doctrine2中的三级继承不加载二级数据。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了doctrine2中的三级继承不加载二级数据。相关的知识,希望对你有一定的参考价值。
我有一个使用类表继承的三级继承,是这样的。
类测试
namespace AppEntitiesTest;
use DoctrineORMMapping as ORM;
/**
* Class Test
* @package AppEntitiesTest
* @ORMEntity
* @ORMInheritanceType("JOINED")
* @ORMDiscriminatorColumn(name="discr", type="string")
* @ORMDiscriminatorMap({"TestA" = "TestA", "TestB" = "TestB"})
* @ORMTable(name="test")
*/
abstract class Test {
/**
* @var integer
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var string
* @ORMColumn(type="string")
*/
protected $columnTest;
}
Class TestM extends Test
namespace AppEntitiesTest;
use DoctrineORMMapping as ORM;
/**
* Class TestM
* @package AppEntitiesTest
* @ORMEntity
*/
abstract class TestM extends Test{
/**
* @var string
* @ORMColumn(type="string")
*/
protected $columnTestM;
}
Class TestA extends TestM
namespace AppEntitiesTest;
use DoctrineORMMapping as ORM;
/**
* Class TestA
* @package AppEntitiesTest
* @ORMEntity
*/
class TestA extends TestM{
/**
* @var string
* @ORMColumn(type="string")
*/
private $columnTestA;
public function __construct(string $columnTest, string $columnTestM, string $columnTestA) {
$this->columnTest = $columnTest;
$this->columnTestM = $columnTestM;
$this->columnTestA = $columnTestA;
}
/**
* @return string
*/
public function getColumnTest(): string {
return $this->columnTest;
}
/**
* @param string $columnTest
*/
public function setColumnTest(string $columnTest): void {
$this->columnTest = $columnTest;
}
/**
* @return string
*/
public function getColumnTestM(): string {
return $this->columnTestM;
}
/**
* @param string $columnTestM
*/
public function setColumnTestM(string $columnTestM): void {
$this->columnTestM = $columnTestM;
}
/**
* @return string
*/
public function getColumnTestA(): string {
return $this->columnTestA;
}
/**
* @param string $columnTestA
*/
public function setColumnTestA(string $columnTestA): void {
$this->columnTestA = $columnTestA;
}
}
我有一个问题,因为当我从我的DB中检索实体时,它的第二层没有数据,只有第一层和最后一层有所有的数据。请注意,columnTestM是空白的。我到底缺了什么?它的三层都有数据,问题只是在我要获取数据的时候。举个例子,我把列的内容用它自己的名称
>>> print_r(EntityManager::getRepository('AppEntitiesTestTest')->find(1));
AppEntitiesTestTestA Object
(
[columnTestA:AppEntitiesTestTestA:private] => columnTestA
[columnTestM:protected] =>
[id:protected] => 1
[columnTest:protected] => columnTest
)
EDIT:
也许这是一个bug,我在GitHub上提交了一个关于错误查询生成的问题。我把我的MariaDB记录所有的查询,以检查正在生成的查询,当我试图检索数据回来,这就是结果。
SELECT
t0.id AS id_3,
t0.column_test AS column_test_4,
t0.discr,
t1.column_test_a AS column_test_a_5,
t2.column_test_b AS column_test_b_6
FROM
test t0
LEFT JOIN
test_as t1 ON t0.id = t1.id
LEFT JOIN
test_bs t2 ON t0.id = t2.id
WHERE
t0.id = 1
它试图与TestB进行左连接,而不是与TestM进行连接。
答案
正如@LBA所说,问题是链上有两个抽象类。 即使有两个抽象类,也应该可以工作,但只有第一个被检索到,但中间的其他类都是空白的。这个问题已经在doctrine的github项目中报告了。
以上是关于doctrine2中的三级继承不加载二级数据。的主要内容,如果未能解决你的问题,请参考以下文章