PHP Laravel( - > with)只有1个结果

时间:2016-12-28 15:04:35

标签: php laravel eloquent

我有2个模型:TheSeriesTheEpisodes

TheSeries有多个TheEpisodesTheEpisodes有一个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

7 个答案:

答案 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();