首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CakePHP 3:如何显示index.ctp中每个记录的关联数据?

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

Stack Overflow用户
提问于 2015-10-19 16:40:14
回答 1查看 8.5K关注 0票数 2

我有两个表artistspictures具有artist hasMany paintings关系。

与其为每个显示相关图片的艺术家提供一个单独的view.ctp,我只是想显示index.ctp文件中的所有内容,所有列出的艺术家与每个相关的图片(ID列表)一起列出。

在阅读了食谱和无数条线索之后,我完全糊涂了,也不明白我是怎么做到的。(我对PHP和Cakephp仍然非常陌生)

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

控制器: ArtistsController.php

代码语言:javascript
运行
复制
..
public function view($id=null)
{
   $artist = $this->Artists->get($id, [
      'contain' => ['Paintings']
   ])
...
}

然后通过执行以下操作,获取相应的view.ctp中的所有内容:

代码语言:javascript
运行
复制
view.ctp
<?php foreach ($artist->paintings as $paintings): ?>
<ul><li> <?= h($paintings->id) ?> </li></ul>
....
<?php endforeach; ?>

但是,如何对表中列出的每个艺术家的index.ctp / index()函数进行类似的操作呢?所以我基本上可以拥有这样的东西:

代码语言:javascript
运行
复制
<?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; ?>

我知道这不是真的那样,但我该怎么做呢?是否必须在控制器index()函数中使用find()查询,并在视图中检索结果之前存储结果?!我试过了,但是它要么什么也不显示,要么显示SQL查询本身,因为我搞砸了语法.

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

甚至一个提示,从哪里开始,这将是很好的!非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-20 16:06:00

好的,我可以理解,我给你举一个例子,它可以帮助你。

two table 1) artists 2) pictures

艺术家有2个领域,id,name

id,artist_id,picture //在这里,artist_id建立了艺术家和绘画之间的关系。

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

代码语言:javascript
运行
复制
 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应该喜欢下面的代码

代码语言:javascript
运行
复制
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中,您可以获取如下代码所示的数据

代码语言:javascript
运行
复制
<?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; ?>

现在你得到的输出就像

代码语言:javascript
运行
复制
jondu 1 2 3

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33219617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档