我有一个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();
答案 0 :(得分:0)
请你试试这个:
$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.*')
);
在字段部分,您可能会或可能不会根据您的要求分配“项目”,“项目”。谢谢