gpt4 book ai didi

mysql - 使用 hasMany 关联连接数据库表 - 存储在数组中

转载 作者:行者123 更新时间:2023-11-29 12:54:27 25 4
gpt4 key购买 nike

在我正在构建的 cakePHP 应用程序中,一个配置文件可以有多个位置;这些表称为“配置文件”和“位置”,在模型类中我定义了 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 个职位,我会获得该配置文件的 5 个实例(每个实例包含所有五个职位!)

我怎样才能实现这个目标?

[编辑]

例如。假设我只有一份个人资料,有两个职位。我得到:

result[0][Profile]
[Position][0]
[1]
[1][Profile]
[Position][0]
[1]

结果[0]和结果[1]中的数据相同。

最佳答案

出现此问题的原因是使用的联接类型。通过内部联接,您将在查询中获得此返回

profile_id      location_id
---------------------------
1 2
1 3

蛋糕将其理解为个人资料的两条记录,因此您会获得具有相同信息的重复个人资料。

如果这就是您问题的全部范围,我会说“采用可包含行为并忘记联接”,但既然您说涉及更多表,也许联接类型无法更改。因此,要获取不重复的唯一配置文件,您必须按查询进行分组才能获取

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'
);

这样你就会摆脱重复。对于 future 这样的问题,最好首先检查发送到数据库的实际查询,检查自己数据库给你的结果是否是你想要的,如果不是,看看你可以在蛋糕中做什么来改变它.

关于mysql - 使用 hasMany 关联连接数据库表 - 存储在数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24287241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com