[英]multiple “has many through” with eloquent of laravel
我雄辩地说,laravel的ORM出了问题,但没有找到解决方案。
我有一些表格如下
球队
- id
- name
用户
- id
- name
- role
- team_id
学生信息
- id
- user_id
- data1
- data2
- etc ...
项目
- id
- student_id
- name
现在,我要查询某个team
所有项目,其中team = 'some team'
现在,这里的事情是,没有ORM,这很简单,我将在原始SQL中进行多个联接。
但是,由于所有这些表都有一个公共列“名称”,因此我必须为所有这些东西加上别名,这确实很无聊
雄辩地说,我找不到使用“有很多通过”的方式进行此查询的方法,因为它只允许使用中级语言,而我无法执行原始SQL,因为alis的事情确实很麻烦,因为它将结果映射到laravel的模型非常困难
尝试建立关系。 假设您已经正确定义了所有关系
$projects = Project::whereHas('students.user.team', function ($query) {
$query->where('name', '=', 'some team');
})->get();
这是3个层次的嵌套。 从未测试。 但是,如果您已经通过hasManyThrough()
定义了项目-用户关系, hasManyThrough()
只能将其缩短到2级。
$projects = Project::whereHas('user.team', function ($query) {
$query->where('name', '=', 'some team');
})->get();
这些将仅为您提供项目数据。 如果您还需要中间数据,请使用即时加载代替with()
。 只需用whereHas()
替换whereHas()
with()
。
$projects = Project::with('user.team', function ($query) {
$query->where('name', '=', 'some team');
})->get();
在这种情况下没有本机关系。
我创建了一个具有无限级别的HasManyThrough
关系: GitHub上的存储库
安装后,您可以像这样使用它:
class Team extends Model {
use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
public function projects() {
return $this->hasManyDeep(Project::class, [User::class, StudentInfo::class],
[null, null, 'student_id']);
}
}
$projects = Team::where('name', 'some team')->first()->projects;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.