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中的三级继承不加载二级数据。的主要内容,如果未能解决你的问题,请参考以下文章

Doctrine2,映射“继承”表

如何更改 Doctrine2 CTI 继承中的实体类型

一级二级三级封锁协议

Vue iview-admin框架二级菜单改为三级菜单

nHibernate 不加载第三级属性(不可刷新缓存)

一级数据缓存,一级指令缓存和二级缓存有啥区别?