我有一个具有以下关联的Item
模型:
public $hasOne = array(
'Project' => array(
'className' => 'Project',
'foreignKey' => 'item_id'
)
);
public $hasMany = array(
'ItemPic' => array(
'className' => 'ItemPic',
'foreignKey' => 'item_id',
'dependent' => false
)
);
我想要针对
Item
的不同视图的自定义数据。似乎CakePHP自动包含Project
数据(也许是因为它是hasOne
?),并且不包含ItemPic
数据。在index
中,我什至都不想要Project
数据...但是,我确实想要ItemPic
数据。对于提取的每个Item
记录,我都希望将单个ItemPic
记录加入其中。此ItemPic
应该基本上是ItemPic.item_id = Item.id
和ORDER BY ItemPic.rank LIMIT 1
。这样做的目的基本上是为了在索引中显示项目列表以及与每个项目相关的图片。我希望所有图像以及
Project
中的view
数据用于单个Item
,而不是列表/索引中的图像。有人告诉我可以这样使用
containable
:// In the model
public $actsAs = array('Containable');
// In the controller
$this->paginate = array(
'conditions' => $conditions,
'contain' => array(
'ItemPic' => array(
'fields' => array('file_name'),
'order' => 'rank',
'limit' => 1
)
)
);
上面的代码实际上可以按我想要的方式工作...但是,我还被告知这样做会导致对每个
Item
运行一个额外的查询...我觉得我应该避免。我尝试这样做,但是我得到了重复的数据,并且没有附加任何
ItemPic
数据: $this->paginate = array(
'conditions' => $conditions,
'joins' => array(
array(
'table' => 'item_pics',
'alias' => 'ItemPic',
'type' => 'LEFT',
'conditions' => array(
'ItemPic.item_id = Item.id'
),
'order' => 'rank ASC',
'limit' => 1
)
)
);
$paginated = $this->Paginator->paginate();
最佳答案
您能尝试一下吗?
$this->paginate = array(
'conditions' => $conditions,
'joins' => array(
array(
'table' => 'item_pics',
'alias' => 'ItemPic',
'type' => 'LEFT',
'conditions' => array(
'ItemPic.item_id = Item.id'
),
'order' => 'rank ASC',
'limit' => 1
)
),
'fields' => array('Item.*','Project.*','ItemPic.*')
);
在字段部分,您可以根据需要分配或不分配“ Item”和“ Project”。
谢谢
关于php - 根据字段的最小值联接相关表中的单个项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21897352/