php - 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();
同样,当我先使用而不是使用时,它也不起作用。
解决方案
使用 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();
推荐阅读
- amazon-web-services - 用于子域的 AWS Cloudfront
- drools - OptaPlanner 是否有“内置”方法来执行多单元分数归一化?
- reactjs - 如何防止 React 重新渲染函数组件中的每个函数
- javascript - 如何让转义热键在微小的情况下工作
- reactjs - Antd Table的“全选”控件的状态可以一键控制吗?
- python - 用鼠标改变图形位置
- angular - 未选中时,如何使材质复选框填充为灰色?
- mqtt - node-red mqtt 刚刚连接
- ios - 带有 UIView 的 SwiftUI 按钮
- xcode - 在 Xcode12 beta 中,Swift 包管理器无法加载依赖项