在我正在构建的cakePHP应用程序中,配置文件可以有多个位置;这些表称为“profiles”和“locations”,在模型类中我定义了HasMany关系。现在我希望用户能够根据他们的位置搜索个人资料。在阅读了这里的一些问题和CakePHP Cookbook后,我决定使用SQL连接(实际上涉及更多的表,搜索的结果应该基于不同表的条件)。
我在Profile模型中编写了以下函数:
public function findProfiles($long, $lat){
$options['joins'] = array(
array('table' => 'locations',
'alias' => 'Location',
'type' => 'Inner',
'conditions' => array('Location.profile_id = Profile.id'))
);
$options['order'] = array('Location.lng ASC'); //this is just as trial
return $this->find('all',$options);
}
代码有效,但我得到了它拥有的每个位置的个人资料副本。也就是说,如果一个配置文件拥有5个位置,我会得到该配置文件的五个实例(每个实例包含所有五个位置!)
我怎样才能做到这一点?
[编辑]
例如。我们假设我只有一个配置文件,有两个位置。我明白了:
result[0][Profile]
[Position][0]
[1]
[1][Profile]
[Position][0]
[1]
结果[0]和结果[1]中的数据相同。
答案 0 :(得分:1)
由于使用的连接类型,会出现问题。使用内部联接,您将获得带有查询的返回
profile_id location_id
---------------------------
1 2
1 3
而且蛋糕理解为两个Profile的记录,所以你会重复使用相同信息的个人资料。
如果这是您问题的全部程度,我会说“使用可包含行为并忘记加入”,但由于您说有更多表涉及,可能无法更改连接类型。因此,要获得唯一的配置文件而不重复,您将不得不通过GROUP BY查询来获取
profile_id location_id
---------------------------
1 2 & 3
使用与此类似的代码
$options['joins'] = array(
array('table' => 'locations',
'alias' => 'Location',
'type' => 'Inner',
'conditions' => array('Location.profile_id = Profile.id')),
'group' => 'Profile.id'
);
你将摆脱重复。对于这样的未来问题,最好首先检查发送到数据库的实际查询,检查自己DB提供的结果是否是您想要的,如果没有,请查看您可以在蛋糕中做什么来更改它