我使用laravel的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"我将不得不为所有这些东西添加别名,这真的很无聊
凭借雄辩,我无法找到使用&#34进行此查询的方法;有很多通过"因为它只允许在中级,我不能做一个原始的SQL,因为alis的东西真的很麻烦,因为将结果映射到laravel的模型很难
答案 0 :(得分:1)
尝试关系存在。这假设您已正确定义所有关系
$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();
答案 1 :(得分:1)
在这种情况下没有本机关系。
我创建了一个HasManyThrough
级的无限关系:Repository on 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;