多个"有很多通过"雄辩的laravel

时间:2017-04-05 03:08:48

标签: php sql laravel orm eloquent

我使用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的模型很难

2 个答案:

答案 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;