我有两个表artists
和pictures
,artist hasMany paintings
关系。
不是每个显示相关图片的艺术家都有单独的view.ctp。我只想在index.ctp文件中显示所有艺术家列出的每个相关图片(ID列表)。
在阅读了食谱和无数的线索之后,我完全感到困惑,并且不明白我必须如何做到这一点。 (我还是PHP和Cakephp的新手)
在单一艺术家的view( )
功能中,我可以像这样轻松获得相关图片:
控制器:ArtistsController.php
..
public function view($id=null)
{
$artist = $this->Artists->get($id, [
'contain' => ['Paintings']
])
...
}
然后通过执行以下操作获取相应 view.ctp 中的所有内容:
view.ctp
<?php foreach ($artist->paintings as $paintings): ?>
<ul><li> <?= h($paintings->id) ?> </li></ul>
....
<?php endforeach; ?>
但是,我如何为表中列出的每位艺术家的 index.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; ?>
我知道它不是那样的,但我怎么去做呢? 我是否必须在Controllers index()函数中使用find()查询并在视图中检索结果之前存储结果?!我确实尝试了,但它没有显示任何内容,或者它显示了一个SQL查询本身,因为我搞砸了语法......
因此,在尝试了书中的各种事情并搜索了几个小时之后,似乎我在这里缺少一些基本的理解。我发现的所有类似问题都让我一无所获。
即使是暗示从哪里开始也会很棒!非常感谢!
答案 0 :(得分:5)
好的我可以理解,我给你一个例子,它可以帮助你
有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。