使用hasMany关联加入DB表 - 存储在数组中

时间:2014-06-18 13:43:58

标签: mysql sql cakephp jointable

在我正在构建的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]中的数据相同。

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提供的结果是否是您想要的,如果没有,请查看您可以在蛋糕中做什么来更改它