【发布时间】:2020-04-30 01:06:02
【问题描述】:
我有一个使用类表继承的三个级别的继承,如下所示:
课堂测试
namespace App\Entities\Test;
use Doctrine\ORM\Mapping as ORM;
/**
* Class Test
* @package App\Entities\Test
* @ORM\Entity
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({"TestA" = "TestA", "TestB" = "TestB"})
* @ORM\Table(name="test")
*/
abstract class Test {
/**
* @var integer
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
protected $id;
/**
* @var string
* @ORM\Column(type="string")
*/
protected $columnTest;
}
TestM 类扩展了 Test
namespace App\Entities\Test;
use Doctrine\ORM\Mapping as ORM;
/**
* Class TestM
* @package App\Entities\Test
* @ORM\Entity
*/
abstract class TestM extends Test{
/**
* @var string
* @ORM\Column(type="string")
*/
protected $columnTestM;
}
TestA 类扩展了 TestM
namespace App\Entities\Test;
use Doctrine\ORM\Mapping as ORM;
/**
* Class TestA
* @package App\Entities\Test
* @ORM\Entity
*/
class TestA extends TestM{
/**
* @var string
* @ORM\Column(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;
}
}
我遇到了问题,因为当我要从数据库中检索实体时,它带有没有数据的第二层,只有第一层和最后一层带有所有数据。请注意 columnTestM 是空白的。我错过了什么?它在所有三个级别的数据中都存在,问题只是当我必须得到它时。例如,我将列的内容与它自己的名称放在一起
>>> print_r(\EntityManager::getRepository('App\Entities\Test\Test')->find(1));
App\Entities\Test\TestA Object
(
[columnTestA:App\Entities\Test\TestA:private] => columnTestA
[columnTestM:protected] =>
[id:protected] => 1
[columnTest:protected] => columnTest
)
编辑:
也许这是一个错误,我在 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 进行连接
【问题讨论】:
-
没有测试它,也许你的问题是链中两个抽象类的继承,虽然我很欣赏它应该工作,也许你在那里调查。我发现的一个潜在问题在这里:stackoverflow.com/questions/7269641/…
-
@lba 它正常存在,因此可以正常工作。 Doctrine 在持久化时能够识别这一点,但在检索时无法正常工作。这很奇怪,如果两个抽象类有问题,对象持久化在第二层也会失败,我认为中间表是空的。
-
但是持久性和对象水合的工作方式有点不同,所以它仍然可能是相关的,但确实是一个有趣的行为
-
您是否尝试过在 TestM 上放置 @MappedSuperclass 而不是 @Entity?
-
@lba 是对的,我尝试在中间使用具体类并工作。但它应该可以工作。
标签: laravel symfony doctrine-orm laravel-doctrine