gpt4 book ai didi

php - CakePHP:添加 DISTINCT 以查找导致关联被省略

转载 作者:行者123 更新时间:2023-11-30 23:12:10 24 4
gpt4 key购买 nike

我们构建了一组相当复杂的 $conditions,然后我们使用 Paginator 进行搜索:

$this->Paginator->settings = array( 'conditions'=>$conditions, 
'joins'=>$joins,
'limit'=>25,
//'fields' => array('DISTINCT (User.id)')
);
$resume_display_array = $this->Paginator->paginate('User');

您会看到 'fields' 被注释掉了。当我们取消对该字段的注释时,它会导致关联的模型 Resume 从结果数组中删除(没有它,返回的每个结果都包含一个 [Resume] 键。

为什么会这样?

这是使用了 DISTINCT 选项的 SQL 转储:

SELECT DISTINCT (`User`.`id`), `User`.`id` 
FROM `sw`.`users` AS `User`
LEFT JOIN `sw`.`taggings_users` AS `TaggingUser`
ON (`User`.`id`= `TaggingUser`.`user_id`)
LEFT JOIN `sw`.`taggings` AS `Tagging`
ON (`TaggingUser`.`tagging_id`= `Tagging`.`id`)
LEFT JOIN `sw`.`resumes` AS `Resume`
ON (`Resume`.`user_id` = `User`.`id`)
WHERE `User`.`first_name` LIKE '%jordan%' AND NOT (`Tagging`.`tag_name` = ('done'))
LIMIT 25

这是没有 DISTINCT 选项的 SQL 转储:

SELECT `User`.`id`, `User`.`username`, `User`.`password`, `User`.`role`, `User`.`created`, `User`.`modified`, `User`.`email`, `User`.`wordpress_user_id`, `User`.`first_name`, `User`.`last_name`, `User`.`group_id`, `Resume`.`id`, `Resume`.`user_id`, `Resume`.`wordpress_resume_id`, `Resume`.`wordpress_user_id`, `Resume`.`has_file`, `Resume`.`is_stamped`, `Resume`.`is_active`, `Resume`.`file_extension`, `Resume`.`created`, `Resume`.`modified`, `Resume`.`is_deleted` 
FROM `sw`.`users` AS `User`
LEFT JOIN `sw`.`taggings_users` AS `TaggingUser`
ON (`User`.`id`= `TaggingUser`.`user_id`)
LEFT JOIN `sw`.`taggings` AS `Tagging`
ON (`TaggingUser`.`tagging_id`= `Tagging`.`id`)
LEFT JOIN `sw`.`resumes` AS `Resume`
ON (`Resume`.`user_id` = `User`.`id`)
WHERE `User`.`first_name` LIKE '%jordan%' AND NOT (`Tagging`.`tag_name` = ('done'))
LIMIT 25

更新

这是 $joins 的 var_dump:

array(
(int) 0 => array(
'table' => 'taggings_users',
'type' => 'LEFT',
'alias' => 'TaggingUser',
'conditions' => array(
(int) 0 => 'User.id= TaggingUser.user_id'
)
),
(int) 1 => array(
'table' => 'taggings',
'type' => 'LEFT',
'alias' => 'Tagging',
'conditions' => array(
(int) 0 => 'TaggingUser.tagging_id= Tagging.id'
)
)
)

最佳答案

如果指定fields 选项,则需要指定要检索的所有字段。

通过将它仅设置为 User.id,您告诉它这是您想要返回的唯一字段。

您也可以尝试像下面这样的东西作为一个包罗万象的东西(不确定是否可行,但如果不行,您就会明白 - 您正在限制自己的结果):

'fields' => array('*', 'DISTINCT (User.id)')

关于php - CakePHP:添加 DISTINCT 以查找导致关联被省略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19381376/

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