CakePHP 4.x hasMany foreach

CakePHP 4.x hasMany foreach

我在从视图文件中的 hasMany 关系中获取结果时遇到一些困难。我没有从调试控制台收到任何错误,所以我不确定我在哪里绊倒了。 我想也许我没有在视图文件中正确引用(我不太确定如何为此编写 foreach 函数),如果我没有在 table 文件中正确设置它,等等.

2 tables:“Clinicas”、“Tratamientos”(服务)

目标:在诊所的个人资料页面上,我需要显示该诊所的信息(位置、phone 编号等)并列出与该诊所相关的所有服务。

ClinicasTable.php

public function initialize(array $config): void
{
    parent::initialize($config);

    $this->setTable('clinicas');
    $this->setDisplayField('name');
    $this->setPrimaryKey('clinic_id');

    $this->addBehavior('Timestamp');

    $this->hasMany('Tratamientos', [
        'foreignKey' => 'clinic_id',
        'joinType'   => 'INNER'
    ]);
}

ClinicasController.php

public function view($id = null)
{
    $clinica = $this->Clinicas->get($id, [
        'contain' => ['Tratamientos']
    ]);

    $this->set(compact('clinica'));
}

view.php

<?php foreach($clinica as $tratamiento): ?>

<?= h($clinica->tratamiento->name)?>

<?php endforeach;?>

我查看了 documentation 的关联,但不知道如何从我的 table 中获取数据。我总是可以通过 php 函数做一个 ajax 查询,但我真的很想用 CakePHP 来做。任何帮助将不胜感激!!!

尽管迭代几乎只是基本的 PHP,但书中的示例可能会更有帮助并显示迭代和使用关联数据,即使它应该已经给您一个好主意你的数据在哪里。

您正在获取单个实体(Clinica 的一个实例),因此您不能也不应该对其进行迭代。你的代码将做的是 iterate over all public properties of the entity object,这不是你想要的,并且在你的情况下不会做任何事情,因为默认情况下实体没有任何具体的 public 属性。

关联的数据将在 Clinica 实体的关联 属性 上找到,除非通过关联的 property 选项特别配置,否则 plural, underscored, lowercased variant of the association name,所以对于 Tratamientos,那将是 tratamientos

应该注意的是,您真的应该在这里坚持使用美式英语命名,因为 naming conventions 周围的所有变位符魔术都是为此而设计的,其他语言的名称很容易导致 mismatches/problems 当它们无法正确变形时!

长话短说,您迭代 $clinica 对象的 tratamientos 属性,那是 hasMany 关联数据所在的位置:

<?php foreach($clinica->tratamientos as $tratamiento): ?>

<?= h($tratamiento->name)?>

<?php endforeach;?>

如果您不确定数据结构,请调试它:debug($clinica)