首页 > 解决方案 > laravel 嵌套的急切加载和第一个函数

问题描述

我有 3 个模型

VideoTopic, Video,VideoProgress

关系如下:

VideoTopic:

/**
     * topic to videos Relation
     *
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function videos() : \Illuminate\Database\Eloquent\Relations\HasMany {
        return $this->hasMany("App\Video", "topic_id");
    }

Video:

/**
     * video to topic relation
     *
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function topic() : \Illuminate\Database\Eloquent\Relations\BelongsTo {
        return $this->belongsTo("App\VideoTopic", "topic_i");
    }

    public function progresses() {
        return $this->hasMany("App\VideoProgress", "video_id");
    }

VideoProgress:

public function user() {
        return $this->belongsTo("App\User", "user_id");
    }

    public function video() {
        return $this->belongsTo("App\Video", "video_id");
    }

我正在尝试获取所有视频主题及其视频和每个视频的进度,但我只想获取保存在数据库中的最后一个进度,所以我的代码如下:

$topics = VideoTopic::first()->with(["videos" => function ($query) {
            $query->orderBy("order");
            $query->with(["progresses" => function ($query) {
                $query->latest();
                $query->take(1);
            }]);
        }])->orderBy("order")->get();

但是在上面的代码中,它没有为每个视频提供一个进度,而是仅提供为其中一个视频保存的最后一个进度(而不是其他视频的进度)。它只是给出最后一个。

但我想要的是在可用的情况下为每个视频取得一个进展。

我也尝试了下面的代码:

$topics = VideoTopic::first()->with(["videos" => function ($query) {
            $query->orderBy("order");
        }, "videos.progresses" => function ($query) {
                $query->latest();
                $query->take(1);
            }])->orderBy("order")->get();

同样,当我先使用而不是使用时,它也不起作用。

标签: phplaravelorm

解决方案


使用 hasOne 建立新关系:

  public function lastProgresses() {
        return $this->hasOne("App\VideoProgress", "video_id")->latest();
    }

现在使用这种关系而不是旧的关系:

$topics = VideoTopic::with(["videos" => function ($query) {
            $query->orderBy("order");
        }, "videos.lastProgresses"])->orderBy("order")->first();

推荐阅读