sql - 来自关系的 Laravel Eloquent 联合模型
问题描述
我有一个用户,他可以从不同的关系中开会。他可以直接分配到一个有太多关系的会议,他可以有有太多太多关系的用户组,可以有太多太多关系的会议,他可以负责一对多关系的会议。
我想为一位用户安排所有会议。我不想合并集合,因为我希望能够where
直接在数据库中使用特性。我的尝试是合并所有会议 ID,然后通过“whereIn”获取会议。
$ids = $this->meetings()->select('meetings.id')
->union($this->meetingsFromGroups()->select('meetings.id'))
->union($this->responsibleMeetings()->select('meetings.id'));
return Meeting::whereIn('id', $ids)->get();
当我执行这个时,我得到这个错误:
“SQLSTATE [42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 'union 附近使用的正确语法(选择 `meetings`.`id` from `meetings` inner join `meeting_user_group` on' at line 1 (SQL:...)" 执行的 SQL:
select *
from `meetings`
where `id` in (
(
select `meetings`.`id`
from `meetings`
inner join `meeting_user` on `meetings`.`id` = `meeting_user`.`meeting_id`
where `meeting_user`.`user_id` = 1
)
union
(
select `meetings`.`id`
from `meetings`
inner join `meeting_user_group` on `meeting_user_group`.`meeting_id` = `meetings`.`id`
inner join `user_groups` on `user_groups`.`id` = `meeting_user_group`.`user_group_id`
inner join `user_user_group` on `user_user_group`.`user_group_id` = `user_groups`.`id`
where `user_user_group`.`user_id` = 1
)
union
(
select `meetings`.`id`
from `meetings`
where `meetings`.`responsible_id` = 1
and `meetings`.`responsible_id` is not null
)
)
关系:
public function responsibleMeetings(): HasMany {
return $this->hasMany(Meeting::class, 'responsible_id');
}
public function meetings(): BelongsToMany {
return $this->belongsToMany(Meeting::class)->withTimestamps();
}
public function meetingsFromGroups(): HasManyDeep {
return $this->hasManyDeepFromRelations($this->userGroups(), (new UserGroup())->meetings());
}
我将包Staudenmeir\EloquentHasManyDeep
用于meetingsFromGroups
.
我不能union
在整个会议上使用,因为那样我会得到
SQLSTATE [21000]:基数违规:1222 使用的 SELECT 语句具有不同的列数
因为枢轴字段。
SQL 必须如何更改才能正常工作,我如何使用 Eloquent 做到这一点?
解决方案
默认情况下whereIn
,期望数组对数组项执行IN()
子句,但在您的情况下,您正在发送联合查询,这就是它抛出错误的原因。
$ids = $this->meetings()->select('meetings.id')
->union($this->meetingsFromGroups()->select('meetings.id'))
->union($this->responsibleMeetings()->select('meetings.id'))
->pluck('id')->all();
return Meeting::whereIn('id', $ids)->get();
另外whereIn
也接受一个闭包方法,但不确定如何调用这些相关对象$this->meetings()
,$this->meetingsFromGroups()
以及$this->responsibleMeetings()
在闭包内
return Meeting::whereIn('id', function($query){
$query->select('...')
...;
})->get();
推荐阅读
- asp.net - 多次回滚到不同的方法实体框架 VB.NET
- python - 计算给定长度和可能字符的可能排列
- fitnesse - 使用 SLIM fitNesse 工具的脚本表
- ruby-on-rails - 将 S3 与 Active Storage 一起使用时“请求已过期”
- windows - bat/cmd 文件不能通过任务赢调度程序工作
- angularjs - 在单击刷新按钮之前,该值不会动态更新-Spring+Angular
- qt - 如何在 Qt Designer 中编辑后隐藏 Tab 键顺序
- ios - 使用 UICollectionViewFlowLayout 重新排列不同大小的 UICollectionView 项
- javascript - 在子组件中调用父函数
- android - 多模块app,一个源文件访问多个R文件