CakePHP - 找到自定义嵌套选择LEFT JOIN

时间:2013-06-14 00:00:07

标签: cakephp-2.0

在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中实现该查询?

谢谢,
三通

2 个答案:

答案 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`)))));