我遇到了拉拉维尔的ORM问题,雄辩,还没有找到解决方案。
我有一些表格如下
团队
- id
- name
用户
- id
- name
- role
- team_id
Student_Info
- id
- user_id
- data1
- data2
- etc ...
项目
- id
- student_id
- name
现在,我想查询某个team
的所有项目,其中team = 'some team'
现在的事情是,如果没有ORM,这很简单,我会在原始SQL中完成多个连接。
但是,由于所有这些表都有一个公共列"name",我将不得不为所有这些东西添加别名,这真的很无聊
有了雄辩,我找不到使用"有很多通过"来做这个查询的方法,因为它只允许中间,我不能做一个原始的SQL,因为alis的事情真的很痛苦,因为很难将结果映射到laravel的模型
这种情况没有本机关系。
我创建了一个具有无限级别的HasManyThrough
关系:GitHub 上的存储库
安装后,您可以像这样使用它:
class Team extends Model {
use StaudenmeirEloquentHasManyDeepHasRelationships;
public function projects() {
return $this->hasManyDeep(Project::class, [User::class, StudentInfo::class],
[null, null, 'student_id']);
}
}
$projects = Team::where('name', 'some team')->first()->projects;
尝试关系存在。这假设您已正确定义所有关系
$projects = Project::whereHas('students.user.team', function ($query) {
$query->where('name', '=', 'some team');
})->get();
这是 3 个嵌套级别。从未测试过。但是,如果您已经通过hasManyThrough()
定义了项目-用户关系,则只能将其缩短为 2 个级别。
$projects = Project::whereHas('user.team', function ($query) {
$query->where('name', '=', 'some team');
})->get();
这些将仅为您提供项目的数据。如果还需要中间数据,请改用 with()
的预先加载。只需将whereHas()
替换为with()
即可。
$projects = Project::with('user.team', function ($query) {
$query->where('name', '=', 'some team');
})->get();