【问题标题】:Three level inheritance in doctrine2 not loading second level data学说2中的三级继承不加载二级数据
【发布时间】: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


【解决方案1】:

正如@LBA 所说,问题是链中的两个抽象类。它甚至应该与两个抽象类一起工作,但只检索第一个,而中间的所有其他类都保持空白。在教义的 github 项目中已经报告了问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多