多"has many through"与拉拉维尔雄辩



我遇到了拉拉维尔的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();

最新更新