【问题标题】:Laravel retrieve multiple relationshipsLaravel 检索多个关系
【发布时间】: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);
}

【问题讨论】:

    标签: laravel eloquent


    【解决方案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);
    

    【讨论】:

    猜你喜欢
    • 2017-05-25
    • 2019-08-17
    • 2017-01-17
    • 2023-03-12
    • 1970-01-01
    • 2019-11-14
    • 2014-04-18
    • 2020-11-14
    • 2023-03-04
    相关资源
    最近更新 更多