财产" id"也不是其中一种方法" id()",[...]" __ call()"在课堂上存在并拥有公共访问权限#34; Doctrine \ ORM \ PersistentCollection"

时间:2018-02-13 17:45:39

标签: php symfony doctrine-orm

对于我的生活,我无法让它发挥作用。我在回合计划实体之间存在多对一关系。 计划与One-To-Many的 ProgramDetail 相关。

基本上回合<多对一> 计划<一对多>的 ProgramDetail

回合实体

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Program", inversedBy="rounds")
 * @ORM\JoinColumn(nullable=false)
 */
private $programs;

计划实体

/**
 * @ORM\OneToMany(targetEntity="App\Entity\Round", mappedBy="programs")
 */
private $rounds;

/**
 * @ORM\OneToMany(targetEntity="App\Entity\ProgramDetail", mappedBy="program")
 */
private $details;

ProgramDetail 实体

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Program", inversedBy="details")
 * @ORM\JoinColumn(nullable=false)
 */
private $program;

以下是我根据 ProgramDetail 查询所有现有轮次的方法。

// RoundRepository.php

public function getRoundsWithProgramDetails()
{
    return $this->createQueryBuilder('round')
                ->leftJoin('round.programs', 'rp')
                ->leftJoin('rp.details', 'pd')
                ->getQuery()->execute();
}

以下是我尝试输出的方法

{% for round in rounds %}
<tr>
    <td>{{ round.year }}</td>
    <td>{{ round.programs.details.id }}</td>
    <td>{{ round.scoreSendDate|date('m-d-Y') }}</td>
    <td>{{ round.sampleSendDate|date('m-d-Y') }}</td>
    <td>{{ round.resultSendDate|date('m-d-Y') }}</td>
    <td>{{ round.status }}</td>
</tr>
{% endfor %}

如果我完成这项任务,我会立即在项目上取得40%的进展,因为我主要遇到这样的问题。任何帮助表示赞赏

1 个答案:

答案 0 :(得分:2)

我认为错误是由此行{{ round.programs.details.id }}触发的?

现在round.programs.details是ProgramDetail实体的集合,因为它是OneToMany关系。这就是提到错误消息Doctrine\ORM\PersistentCollection的原因。您基本上尝试访问ProgramDetail实体集合的id属性,这显然不存在。

我认为关系应该是OneToOne而不是ManyToOne / OneToMany,因为在当前形式中,每个程序都可以分配多个 ProgramDetails,因此它们表示为实体的列表/集合而不是作为一个单一的实体。

如果没有,您需要在该列表中指定索引以获取ID:{{ round.programs.details.first.id }}或者通常找到另一种使用 ProgramDetail实体列表的方式那里。