既不是属性“patient”,也不是连接表Symfony 6的方法之一

Neither the property "patient" nor one of the methods in joining tables Symfony 6

提问人:hareth py 提问时间:11/11/2023 更新时间:11/11/2023 访问量:25

问:

我正在尝试在Symfony 6中通过一个关系列连接两个表,其中一个表与另一个表具有OneToMany关系。

这是我的控制器逻辑

#[Route('/admin/patients', name: 'app_patients')]
public function patients(PatientsRepository $patients, EntityManagerInterface $entityManager): Response
{

    $query = $entityManager->createQuery(
        'SELECT patients, patientsInfo
    FROM App\Entity\Patients patients
    JOIN App\Entity\PatientsInformation patientsInfo
    WHERE patientsInfo.patientID = patients.id'
    );


    $data = $query->getResult();

    return $this->render('main/tables.html.twig', ['data' => $data]);
}

我的树枝模板

                                {% for item in data %}
                                <tr>
                                    <td>{{ item.patient.id }}</td>
                                    <td><i class="fas fa-user-nurse fs-5"></i> {{ item.patient.name }}</td>
                                    <td>{{ item.patientsInfo.nationality }}</td>
                                    <td>{{ item.patient.unhcrID }}</td>
                                    <td>No</td>
                                    <td>{{ item.patient.creationDate|date('Y-m-d') }}</td>
                                    <td>None</td>
                                    <td>
                                        <a class="btn btn-primary" role="button">More</a>
                                        <a class="btn btn-danger" role="button">Delete</a>
                                    </td>
                                </tr>
                            {% endfor %}

它抛出的错误是

属性“patient”和方法“patient()”、“getpatient()”/“ispatient()”/“haspatient()”或“__call()”都不存在,并且在类“App\Entity\Patients”中具有公共访问权限。

PHP 交响乐

评论


答:

0赞 craigh 11/11/2023 #1

学习一些基本的调试技术将帮助您了解下一步该做什么。像从模板中转储值这样简单的事情,会告诉你内部结构是什么样子的。data

在循环之前(例如,before ),添加一个转储命令:{% for item in data %}

{{ dump(data) }}

然后结构将很明显。

您还可以在控制器中使用 php 函数。这会将变量添加到 Symfony 工具栏进行检查。使用 php 函数会将内容直接转储到浏览器,然后停止程序的其余部分执行(例如“转储并死亡”)。dump($data);dd($data);

有关更多信息,请参阅 Symfony 的文档:https://symfony.com/doc/current/components/var_dumper.html

最后,使用存储库方法或查询生成器使用 DQL 收集数据将受益匪浅。下面是一个查询生成器示例:

$patients = $this->entityManager
    ->createQueryBuilder()
    ->from(Patients::class, 'patients')
    ->leftJoin('patients.patientInformation', 'information') // guessing on naming here
    ->select('patients', 'information')
    ->getQuery()->getResult();

您的结果将是 的集合。patients

将其分配给模板['patients' => $patients]

循环:

    {% for patient in patients %}

现在你的变量有意义了。Your 是 的实例,并具有它的所有属性和方法。您可以直接引用每个:patientPatients

    {% for patient in patients %}
    <tr>
         <td>{{ patient.id }}</td>
         <td><i class="fas fa-user-nurse fs-5"></i> {{ patient.name }}</td>
         <td>{{ patient.patientInformation.nationality }}</td>
         <td>{{ patient.unhcrID }}</td>
         <td>No</td>
         <td>{{ patient.creationDate|date('Y-m-d') }}</td>
         <td>None</td>
         <td>
              <a class="btn btn-primary" role="button">More</a>
              <a class="btn btn-danger" role="button">Delete</a>
         </td>
    </tr>
    {% endfor %}

您还应该考虑将实体更改为类的一个实例代表一个患者,而不是整个集合。PatientsPatient

祝你好运!