根据 CakePHP 中的关联模型分组
group by on associated model in CakePHP
我正在使用 CakePHP 3.4
我有两个模型skills
和skill_categories
,它们的关联就像
skill_categories->hasMany('skills');
skills->belongsTo('SkillCategories', 'joinType' => 'INNER')
和 skills
与 users
有关联,其中
skills->belongsTo('users')
users->hasMany('Skills')
我必须 select 来自 skills
table 的用户的所有关联 skills
按 skills.skill_category_id
分组,这将产生类似 [=30= 的结果]
Skill Category 1
|-- Skill 11
|-- Skill 12
|-- Skill 13
Skill Category 2
|-- Skill 21
|-- Skill 22
或喜欢
'skill_categories' => [
'title' => 'Skill Category 1',
'id' => 1,
'skills' => [
0 => [
'title' => 'Skill 11',
'id' => 4,
],
1 => [
'title' => 'Skill 12',
'id' => 6,
]
],
]
我正在做的是:方法一
$user_skills = $this->Skills->find()
->select(['Skills.skill_category_id', 'Skills.title', 'Skills.measure', 'SkillCategories.title', 'Skills.id'])
->where(['Skills.user_id' => $user->id, 'Skills.deleted' => false, 'Skills.status' => 0])
->contain(['SkillCategories'])
->group(['Skills.skill_category_id']);
foreach($user_skills as $s)debug($s);
但这是抛出错误
Error: SQLSTATE[42000]: Syntax error or access violation: 1055
Expression #2 of SELECT list is not in GROUP BY clause and contains
nonaggregated column 'profPlus_db_new.Skills.title' which is not
functionally dependent on columns in GROUP BY clause; this is
incompatible with sql_mode=only_full_group_by
方法二
$user_skills = $this->SkillCategories->find()
->where(['Skills.user_id' => $user->id, 'Skills.deleted' => false, 'Skills.status' => 0])
->contain(['Skills'])
->group(['SkillCategories.id']);
foreach($user_skills as $s)debug($s);
但这给出了错误
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column
'Skills.user_id' in 'where clause'
编辑 2
技能架构
CREATE TABLE IF NOT EXISTS `skills` (
`id` CHAR(36) NOT NULL,
`user_id` CHAR(36) NOT NULL,
`skill_category_id` CHAR(36) NOT NULL,
`title` VARCHAR(250) NOT NULL,
`measure` INT NOT NULL DEFAULT 0,
`status` INT NULL DEFAULT 0,
`deleted` TINYINT(1) NULL DEFAULT 0,
`created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`modified` DATETIME NULL,
PRIMARY KEY (`id`)
)
skill_categories 架构
CREATE TABLE IF NOT EXISTS `skill_categories` (
`id` CHAR(36) NOT NULL,
`title` VARCHAR(200) NOT NULL,
`status` INT NULL DEFAULT 0,
`deleted` TINYINT(1) NULL DEFAULT 0,
`created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`modified` DATETIME NULL,
PRIMARY KEY (`id`))
控制器代码
$user_skills = $this->SkillCategories->find()
->contain([
'Skills' => function($q) use($user) {
return $q
->select(['id', 'skill_category_id', 'title', 'measure', 'user_id', 'deleted', 'status'])
->where(['user_id' => $user->id, 'deleted' => false, 'status' => 0]);
}])
->group(['SkillCategories.id']);
foreach($user_skills as $s)debug($s);
调试输出
object(App\Model\Entity\SkillCategory) {
'id' => '581cd4ac-28a7-4016-b535-b34a27d47c0d',
'title' => 'Programming',
'status' => (int) 0,
'deleted' => false,
'skills' => [
(int) 0 => object(App\Model\Entity\Skill) {
'id' => '36f16f7f-b484-4fd8-bfc5-4408ce97ff23',
'skill_category_id' => '581cd4ac-28a7-4016-b535-b34a27d47c0d',
'title' => 'PHP',
'measure' => (int) 92,
'user_id' => '824fbcef-cba8-419e-8215-547bd5d128ad',
'deleted' => false,
'status' => (int) 0,
'[repository]' => 'Skills'
},
(int) 1 => object(App\Model\Entity\Skill) {
'id' => '4927e7c1-826a-405d-adbe-e8c084c2b9ef',
'skill_category_id' => '581cd4ac-28a7-4016-b535-b34a27d47c0d',
'title' => 'CakePHP',
'measure' => (int) 90,
'user_id' => '824fbcef-cba8-419e-8215-547bd5d128ad',
'deleted' => false,
'status' => (int) 0,
'[repository]' => 'Skills'
}
],
'[repository]' => 'SkillCategories'
}
object(App\Model\Entity\SkillCategory) {
'id' => 'd55a2a95-05a0-410e-9a55-1a1509f76b8c',
'title' => 'Office',
'status' => (int) 0,
'deleted' => false,
'skills' => [],
'[repository]' => 'SkillCategories'
}
注意 : 参见第 2 个 object,标题为 Office 没有 skills
与用户 [=30] 关联=]
您可以将条件传递到包含中! :D
$user_skills = $this->SkillCategories->find()
->contain(['Skills' => function($q) use($user) {
return $q
->select(['id', 'user_id', 'deleted', 'status', 'skill_category_id'])
->where(['user_id' => $user->id, 'deleted' => false, 'status' => 0]);
}])
->group(['SkillCategories.id']);
我正在使用 CakePHP 3.4
我有两个模型skills
和skill_categories
,它们的关联就像
skill_categories->hasMany('skills');
skills->belongsTo('SkillCategories', 'joinType' => 'INNER')
和 skills
与 users
有关联,其中
skills->belongsTo('users')
users->hasMany('Skills')
我必须 select 来自 skills
table 的用户的所有关联 skills
按 skills.skill_category_id
分组,这将产生类似 [=30= 的结果]
Skill Category 1
|-- Skill 11
|-- Skill 12
|-- Skill 13
Skill Category 2
|-- Skill 21
|-- Skill 22
或喜欢
'skill_categories' => [
'title' => 'Skill Category 1',
'id' => 1,
'skills' => [
0 => [
'title' => 'Skill 11',
'id' => 4,
],
1 => [
'title' => 'Skill 12',
'id' => 6,
]
],
]
我正在做的是:方法一
$user_skills = $this->Skills->find()
->select(['Skills.skill_category_id', 'Skills.title', 'Skills.measure', 'SkillCategories.title', 'Skills.id'])
->where(['Skills.user_id' => $user->id, 'Skills.deleted' => false, 'Skills.status' => 0])
->contain(['SkillCategories'])
->group(['Skills.skill_category_id']);
foreach($user_skills as $s)debug($s);
但这是抛出错误
Error: SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'profPlus_db_new.Skills.title' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
方法二
$user_skills = $this->SkillCategories->find()
->where(['Skills.user_id' => $user->id, 'Skills.deleted' => false, 'Skills.status' => 0])
->contain(['Skills'])
->group(['SkillCategories.id']);
foreach($user_skills as $s)debug($s);
但这给出了错误
Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Skills.user_id' in 'where clause'
编辑 2
技能架构
CREATE TABLE IF NOT EXISTS `skills` (
`id` CHAR(36) NOT NULL,
`user_id` CHAR(36) NOT NULL,
`skill_category_id` CHAR(36) NOT NULL,
`title` VARCHAR(250) NOT NULL,
`measure` INT NOT NULL DEFAULT 0,
`status` INT NULL DEFAULT 0,
`deleted` TINYINT(1) NULL DEFAULT 0,
`created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`modified` DATETIME NULL,
PRIMARY KEY (`id`)
)
skill_categories 架构
CREATE TABLE IF NOT EXISTS `skill_categories` (
`id` CHAR(36) NOT NULL,
`title` VARCHAR(200) NOT NULL,
`status` INT NULL DEFAULT 0,
`deleted` TINYINT(1) NULL DEFAULT 0,
`created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
`modified` DATETIME NULL,
PRIMARY KEY (`id`))
控制器代码
$user_skills = $this->SkillCategories->find()
->contain([
'Skills' => function($q) use($user) {
return $q
->select(['id', 'skill_category_id', 'title', 'measure', 'user_id', 'deleted', 'status'])
->where(['user_id' => $user->id, 'deleted' => false, 'status' => 0]);
}])
->group(['SkillCategories.id']);
foreach($user_skills as $s)debug($s);
调试输出
object(App\Model\Entity\SkillCategory) {
'id' => '581cd4ac-28a7-4016-b535-b34a27d47c0d',
'title' => 'Programming',
'status' => (int) 0,
'deleted' => false,
'skills' => [
(int) 0 => object(App\Model\Entity\Skill) {
'id' => '36f16f7f-b484-4fd8-bfc5-4408ce97ff23',
'skill_category_id' => '581cd4ac-28a7-4016-b535-b34a27d47c0d',
'title' => 'PHP',
'measure' => (int) 92,
'user_id' => '824fbcef-cba8-419e-8215-547bd5d128ad',
'deleted' => false,
'status' => (int) 0,
'[repository]' => 'Skills'
},
(int) 1 => object(App\Model\Entity\Skill) {
'id' => '4927e7c1-826a-405d-adbe-e8c084c2b9ef',
'skill_category_id' => '581cd4ac-28a7-4016-b535-b34a27d47c0d',
'title' => 'CakePHP',
'measure' => (int) 90,
'user_id' => '824fbcef-cba8-419e-8215-547bd5d128ad',
'deleted' => false,
'status' => (int) 0,
'[repository]' => 'Skills'
}
],
'[repository]' => 'SkillCategories'
}
object(App\Model\Entity\SkillCategory) {
'id' => 'd55a2a95-05a0-410e-9a55-1a1509f76b8c',
'title' => 'Office',
'status' => (int) 0,
'deleted' => false,
'skills' => [],
'[repository]' => 'SkillCategories'
}
注意 : 参见第 2 个 object,标题为 Office 没有 skills
与用户 [=30] 关联=]
您可以将条件传递到包含中! :D
$user_skills = $this->SkillCategories->find()
->contain(['Skills' => function($q) use($user) {
return $q
->select(['id', 'user_id', 'deleted', 'status', 'skill_category_id'])
->where(['user_id' => $user->id, 'deleted' => false, 'status' => 0]);
}])
->group(['SkillCategories.id']);