在CakePHP中进行查找时如何进行嵌套选择?
这是我目前的简化数据。
Listings
id | title | content
----------------------
1 | Listing 1 | ...
Media
id | listing_id | file
----------------------------------
1 | 1 | file 1
2 | 1 | file 2
所以当我这样做时。
$this->Listing->find('all');
这是我得到的输出。
id | title | content | id | listing_id | file
------------------------------------------------------------------
1 | Listing 1 | ... | 1 | 1 | file 1
1 | Listing 1 | ... | 1 | 1 | file 2
查询如下
SELECT * FROM `listings` AS `Listing`
LEFT JOIN `media` AS `Image` ON (`Listing`.`id` = `Image`.`listing_id`)
但是,我很乐意加入Media表的第一行。
基本上,这是我正在寻找的查询
SELECT * FROM `listings` AS `Listing`
LEFT JOIN `media` AS `Image` ON (`Image`.`id` = (SELECT MIN(`Image`.`id`) FROM `media` AS `Image` WHERE `Listing`.`id` = `Image`.`listing_id`))
如何在CakePHP中实现该查询?
谢谢,
三通
答案 0 :(得分:1)
您可以使用与自定义查询查询的hasMany
关联来实现此目的。
在你的Listing
模型中,你会做这样的事情(未经测试)。
public $hasMany = array(
'Image'=>array(
'finderQuery'=>'SELECT MIN(`Image`.`id`) FROM `media` AS `Image` WHERE `Listing`.`id` = `Image`.`listing_id`)'
)
);
了解更多 - > Custom Finder Query
答案 1 :(得分:1)
这就是我开始工作的方式。
$this->Listing->find('all', 'contain' => array('Image' => array('conditions' => array(SELECT MIN(`Image`.`id`) FROM `media` AS `Image` WHERE `Listing`.`id` = `Image`.`listing_id`)))));