Laravel 检索多个关系

Posted

技术标签:

【中文标题】Laravel 检索多个关系【英文标题】:Laravel retrieve multiple relationships 【发布时间】:2022-01-10 13:37:02 【问题描述】:

我有一个 laravel 项目,其中 User 可以有许多 Client 类。 Client 可以有很多 SessionSession 可以有很多 Assessment 和很多 Plan。我在Client 上使用hasManyThrough 来获取AssessmentPlan。每个AssessmentPlan 都有一个review_date 时间戳保存到数据库中。

我想做的是获得所有AssessmentPlan 的任何Client 和他们的review_date,就像今天一样。理想情况下是这样的:

$events = Auth::user()->reviews()->today();

我不知道该怎么做才能实现 reviews 函数,因为它本质上是结合了 2 个关系。

谁能帮帮我?

User.php

public function clients()

    return $this->hasMany(Client::class);


public function assessments()

    return $this->hasManyThrough(Assessment::class, Client::class);


public function plans()

    return $this->hasManyThrough(Plan::class, Client::class);


public function reviews()

    // return all assessments and plans


public function scopeToday(Builder $query)

    $query->whereDate('review_date', Carbon::today());

Client.php

public function assessments()

    return $this->hasManyThrough(Assessment::class, Session::class);


public function plans()

    return $this->hasManyThrough(Plan::class, Session::class);

Session.php

public function assessments()

    return $this->hasMany(Assessment::class);


public function plans()

    return $this->hasMany(Plan::class);

【问题讨论】:

【参考方案1】:

你可以从这两种方法中得到一个集合,所以你可以简单地merge the 2 together。 (请注意,当您必须在循环期间检查对象类型时,这将导致稍后代码难看。)您不能链接范围方法,因为您没有取回关系对象,但您可以将日期传递为而是一个参数,或者如果您永远不需要其他日期,则只需在今天的日期修复它。

public function reviews(Carbon $date)

    return $this
        ->assessments()
        ->whereDate('review_date', $date)
        ->get()
        ->toBase()
        ->merge(
            $this->plans()->whereDate('review_date', $date)->get()->toBase()
        )
        ->sortBy('review_date');

然后这样称呼它:

$date = now();
$events = Auth::user()->reviews($date);

【讨论】:

如果您合并 2 个不同的 eloquent 集合,您可能会丢失记录,因为它构建了一个由模型键作为键的字典,并且两个集合可能具有具有相同 id 的模型 merge() 的文档说它是数字键的附加。模型集合不以主键为键。 laravel.com/docs/8.x/collections#method-merge Eloquent Collections 是从 Collections 扩展而来并覆盖某些方法,例如 merge,因为它们使用由模型的主键作为键控的字典......它在代码中,Eloquent\Collection@merge github.com/laravel/framework/blob/8.x/src/Illuminate/Database/… Eloquent\Collection@getDictionary github.com/laravel/framework/blob/8.x/src/Illuminate/Database/… “获取由主键键入的字典” ...它们的行为与基本集合不同 ***.com/questions/51534929/… 嗯,很高兴知道,我已经更新了答案。 Eloquent 集合似乎有些不一致,比如 Model::all()[1] 返回集合中的第二项,不管 ID 是什么,或者 Model::all()->toArray() 返回一个非稀疏数组。

以上是关于Laravel 检索多个关系的主要内容,如果未能解决你的问题,请参考以下文章

从 Laravel 中的关系中检索关系

Laravel 插入和检索关系

通过 Laravel 关系查询 HasManyThrough 检索相关记录

检索多态关系 laravel 的所有者

无法在 Laravel 4 中检索一对多关系

Laravel 计数和检索多对多关系