Трехуровневое наследование в doctrine2 без загрузки данных второго уровня - PullRequest
1 голос
/ 30 апреля 2020

У меня есть наследование трех уровней с использованием наследования таблиц классов, например:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...