我有2个模型:TheSeries
和TheEpisodes
。
TheSeries
有多个TheEpisodes
,TheEpisodes
有一个TheSeries
。
我正在尝试列出所有TheSeries
并使用TheEpisodes.addDate
在每个中显示latestEpisode。
我现在的代码是:
$TheSeries = TheSeries::with('TheEpisodes');
我应该怎么做才能为每部电视连续剧只显示最新的一集?
->take(1)
和->limit(1)
不适用于TheEpisodes
$results = TheSeries::take(5)->with(['TheEpisodes' => function($q) {
$q->orderBy('addDate', 'desc');
}])->get()
这样可行,它会以正确的顺序返回剧集,但我无法将结果限制为1.以下代码不起作用:
// Example 1
$results = TheSeries::take(5)->with(['TheEpisodes' => function($q) {
$q->orderBy('addDate', 'desc')->take(1);
}])->get()
// Example 2
$results = TheSeries::take(5)->with(['TheEpisodes' => function($q) {
$q->orderBy('addDate', 'desc')->limit(1);
}])->get()
// Example 3
$results = TheSeries::take(5)->with(['TheEpisodes' => function($q) {
$q->orderBy('addDate', 'desc')->first();
}])->get()
这些是表的列名:
TheSeries - id,originalTitle,aliasTitle,description,imageURL,startingDate,endingDate,activeBool
TheEpisodes:id,seriesID,authorID,addDate,episodeVersion
答案 0 :(得分:1)
您可以尝试:
$TheSeries = TheSeries::with(['TheEpisodes' => function($q) {
$q->orderBy('created_at', 'desc')->take(1);
}])
->get();
或尝试使用limit
作为:
$TheSeries = TheSeries::with(['TheEpisodes' => function($q) {
$q->orderBy('created_at', 'desc')->limit(1);
}])
->get();
答案 1 :(得分:1)
在TheLatestEpisode
模型上定义hasOne
TheSeries
关系:
class TheSeries extends Model
{
public function TheLatestEpisode()
{
return $this->hasOne(TheEpisode::class, 'seriesID')->orderBy('id', 'desc');
}
}
然后你可以很容易地做到:
$series = TheSeries::with('TheLatestEpisode')->get();
答案 2 :(得分:0)
$TheSeries = TheSeries::with(['TheEpisodes' => function($q) {
$q->orderBy('created_at', 'desc')->first();
}])
->get();
无法正常工作?
答案 3 :(得分:0)
为什么不使用DB
声明?
DB::table('TheEpisodes')
->leftjoin('TheSeries','TheEpisodes.SeriesId','=','TheSeries.id')
->select('TheEpisodes.*','TheSeries.id as sId','TheSeries.name as sName',...)
->orderBy('TheEpisodes. addDate','desc')
->take(1)
->get();
答案 4 :(得分:0)
你可以在TheSeries模型中尝试这样的事情:(它更容易)
public function getLatestEpisodeAttribute(){
$episode = TheEpisodes::where('series_id',$this->attributes['id'])
->latest()
->first();
if(!$episode){
return "no episodes for this Series";
}
return $episode;
}
在您的控制器上,只需正常执行查询,不包含与TheSeries
相关的任何内容,您可以在刀片文件中访问它,如下所示:
//lets suppose there is a title attibute in the episodes
{{$TheSeries->latest_episode->title}}
//or a duration attribute
{{$TheSeries->latest_episode->duration}}
答案 5 :(得分:0)
我找到的最佳解决方案是与orderBy('addDate')建立一对一的关系,它有效!
参考:https://softonsofa.com/tweaking-eloquent-relations-how-to-get-latest-related-model/
答案 6 :(得分:-2)
$TheSeries = TheSeries::with('TheEpisodes')->first();
或者
$TheSeries = TheSeries::with('TheEpisodes')->firstOrFail();