CakePHP 3:如何显示index.ctp中每条记录的关联数据


CakePHP 3: How to display associated data for each record in index.ctp?

我有两个表artistspicturesartist hasMany paintings关系

而不是单独的视图。显示相关图片的每个艺术家的CTP。我只想显示索引中的所有内容。ctp文件列出的所有艺术家与每个人的相关图片(id列表)。

在阅读了烹饪书和无数的线程之后,我完全困惑了,不明白我为什么要这样做。(我对PHP和Cakephp还很陌生)

在单个艺术家的view( )函数中,我可以轻松地获得相关图片,如下所示:

Controller: ArtistsController.php

..
public function view($id=null)
{
   $artist = $this->Artists->get($id, [
      'contain' => ['Paintings']
   ])
...
}
然后在相应的视图中获取所有内容。ctp
view.ctp
<?php foreach ($artist->paintings as $paintings): ?>
<ul><li> <?= h($paintings->id) ?> </li></ul>
....
<?php endforeach; ?>
但是我如何为索引做类似的事情呢?ctp/index()函数为表中列出的每个艺术家?所以我可以这样写:
<?php foreach ($artists as $artist): ?>
    <tr><td> <?= h($artist->name) ?> </td></tr>
    <tr><td> <?php foreach ($artist->paintings as $paintings): ?>
             <ul><li> <?= h($painting->id) ?> </li></ul>
             <?php endforeach; ?>
    </tr></td>
<?php endforeach; ?>

我知道它实际上不是那样工作的,但是我该怎么做呢?我是否必须在控制器索引()函数中使用find()查询并在视图中检索结果之前存储结果?!我确实尝试过,但它要么不显示任何内容,要么显示SQL查询本身,因为我搞砸了语法…

所以在尝试了书中的各种东西并搜索了几个小时之后,我似乎在我的大脑中缺少了一些基本的理解。而且我发现的所有类似的问题都让我一无所获。

甚至一个提示从哪里开始将是伟大的!非常感谢!

好的,我给你一个例子,它可能会帮助你。

two table 1) artists 2) pictures

艺术家有2个字段id,name
和图片有3个字段id,artist_id,picture//这里artist_id已经建立了艺术家和图片之间的关系。

这里的艺术家与图片有很多关系,所以我们将在Model'Table'ArtistsTable.php

 public function initialize(array $config)
 {
        parent::initialize($config);
        $this->table('artists');
        $this->displayField('name');
        $this->primaryKey('id');
        $this->hasMany('Pictures', [
            'foreignKey' => 'artist_id'
        ]);
 }

那么Controller'ArtistsController.php index method应该像下面的代码

public function index()
{
        $this->paginate =[
            'contain'   => ['Pictures']   //with artists We also fetch pictures
        ];
        $this->set('artists', $this->paginate($this->Artists));
        $this->set('_serialize', ['artists']);
}

现在在Template'Artists'index.ctp中,你可以像下面的代码获取数据

<?php foreach ($artists as $artist): ?>
    <?= h($artist->name) ?>  // fetch artists name from artists table 
  <?php foreach ($artist->pictures as $pictures): ?>  
    <?= h($pictures->picture) ?>  // fetch pictures according to artists 
  <?php endforeach; ?>
<?php endforeach; ?>

现在你得到了像

这样的输出
jondu 1 2 3

这里jondu是一个名字,他有3张照片1,2,3。