【问题标题】:Doctrine entity collection is null after database request数据库请求后学说实体集合为空
【发布时间】:2025-12-02 03:50:02
【问题描述】:

我正在尝试在我的 symfony 应用程序 3.3.5 中使用实体上的集合 当我创建一个新对象并在其中添加集合时,我的配置工作正常。 但是当我试图从数据库中获取现有集合时,它始终为空。 我的实体看起来像这样

class HydraulicTest
{ 
...
/**
 * @var \Me\MyBundle\Entity\HydraulicTestResult
 * 
 * @ORM\OneToMany(targetEntity="Me\MyBundle\Entity\HydraulicTestResult", mappedBy="idHydraulicTest")
 */
private $hydraulicTestResults;

public function __construct()
{
    $this->hydraulicTestResults = new ArrayCollection();
}
...
/**
 * Get hydraulicTestResults
 *
 * @return \Me\MyBundle\Entity\HydraulicTestResult
 */
public function getHydraulicTestResults()
{
    return $this->hydraulicTestResults;
}
}

class HydraulicTestResult
{...
/**
 * @var \Me\MyBundle\Entity\HydraulicTest
 *
 * @ORM\ManyToOne(targetEntity="Me\MyBundle\Entity\HydraulicTest", inversedBy="hydraulicTestResults")
 * @ORM\JoinColumns({
 *   @ORM\JoinColumn(name="id_hydraulic_test", referencedColumnName="id")
 * })
 */
private $idHydraulicTest;
...
/**
 * Set idHydraulicTest
 *
 * @param \Me\MyBundle\Entity\HydraulicTest $idHydraulicTest
 *
 * @return HydraulicTestResult
 */
public function setIdHydraulicTest(\Me\MyBundle\Entity\HydraulicTest $idHydraulicTest = null)
{
    $this->idHydraulicTest = $idHydraulicTest;

    return $this;
}

/**
 * Get idHydraulicTest
 *
 * @return \Me\MyBundle\Entity\HydraulicTest
 */
public function getIdHydraulicTest()
{
    return $this->idHydraulicTest;
}
}

这就是我现在在控制器中所做的事情

$HydraulicTest = new HydraulicTest();
$HydraulicTest->setTester('This is a test');
$hydraulicTestResult=  new HydraulicTestResult();
$hydraulicTestResult->setFluidTemperature(12);
$HydraulicTest->getHydraulicTestResults()->add($hydraulicTestResult);    
$hydraulicTestResult2=  new HydraulicTestResult();
$hydraulicTestResult2->setFluidTemperature(44);
$HydraulicTest->getHydraulicTestResults()->add($hydraulicTestResult2);

这很好用,当我显示我的实体时将数组集合返回给我

HydraulicTest {#1654 ▼
  -comment: "test"
  -validationComment: null
  -model: null
  -tester: "This is a test"
  -hydraulicTestResults: ArrayCollection {#2651 ▼
    -elements: array:2 [▼
      0 => HydraulicTestResult {#2652 ▼
        -temperature: 12
      }
      1 => HydraulicTestResult {#2653 ▼
        -temperature: 44
      }
    ]
  }
}

调用无效

$EntityHydraulicTest = $this->getDoctrine()->getRepository(HydraulicTest::class)->findOneById($id);
$EntityHydraulicTest->getHydraulicTestResults();

即使数据库中的 HydraulicTestResult 中有元素链接到 HydraulicTest 实体,ArrayCollection 也总是返回 null

HydraulicTest {#2688 ▼
  -comment: "test"
  -validationComment: null
  -model: null
  -tester: null
  -id: 8
  -hydraulicTestResults: null
}

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    编辑:在执行以下任何操作之前,请检查您在resources/config/doctrine/ 下是否有一些文件并将它们删除(您可以在删除它们之前进行备份)因为 symfony 如果在那里找到文件将忽略您的注释!

    阅读这篇关于教义关联的帖子将帮助您更好地理解这个问题:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/working-with-associations.html

    当双向关联更新时,Doctrine 只检查双方之一的这些更改。这称为关联的拥有方。

    Doctrine 仅检查您的关联的owning side,即HydraulicTestResult

    拥有方必须使用 OneToOne、ManyToOne 或 ManyToMany 映射声明的 inversedBy 属性。 inversedBy 属性包含反面关联字段的名称。

    ManyToOne 始终是双向关联的拥有方。 OneToMany 始终是双向关联的反面。

    为了让你的代码工作,你必须这样做:

    $HydraulicTest = new HydraulicTest();
    $HydraulicTest->setTester('This is a test');
    $hydraulicTestResult=  new HydraulicTestResult();
    $hydraulicTestResult->setIdHydraulicTest($HydraulicTest);// add this line 
    ....
    $em->persist($hydraulicTestResult);
    $em->persist($HydraulicTest);
    $em->flush();
    

    或者你可以像这样在HydraulicTestResult 类中添加一个方法:

    function addHydraulicTestResult(HydraulicTestResult $test){
        $this->hydraulicTestResults->add($test);
        $test->setIdHydraulicTest($this);
    }
    

    然后在你的代码中使用它:

    $HydraulicTest = new HydraulicTest();
    $HydraulicTest->setTester('This is a test');
    $hydraulicTestResult=  new HydraulicTestResult();
    $HydraulicTest->addHydraulicTestResult($hydraulicTestResult);
    ...
     ....
    $em->persist($hydraulicTestResult);
    $em->persist($HydraulicTest);
    $em->flush();
    

    【讨论】:

    • 有些东西我不明白。我只有这行 $EntityHydraulicTest = $this->getDoctrine()->getRepository(HydraulicTest::class)->findOneById($id);我没有 $hydraulicTestResult 对象。我想我完全迷路了^^
    • 我编辑了我的答案以更清楚地说明代码。您是否尝试过我上面提到的建议之一?
    • 是的,我现在更好地理解了您的答案,并且在我冲洗时它可以工作。但问题是当我尝试从数据库中检索液压测试时。即使数据库中有一个,我也没有任何液压测试结果返回。我想我必须使用存储库查询来加入液压测试结果表。
    • 你不应该加入以获得结果,因为doctrine 的目标是避免每次都这样做。你能发布Doctrine\Common\Util\Debug::dump($EntityHydraulicTest)的结果吗?
    • 哦不,您需要删除该文件夹,您必须使用注释或 .orm.xml 文件。删除文件夹 config/doctrine ,清除缓存并测试它应该可以工作。