У меня есть наследование трех уровней с использованием наследования таблиц классов, например:
Class Test
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;
}
Class TestM extends 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;
}
Class TestA extends 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