只选择与Laravel相关的行

时间:2018-07-10 19:56:18

标签: php laravel eloquent relationship

仅选择具有关系的行时遇到问题。我尝试了许多不同的解决方案。我有2个表MoviesMovie_links。我只想获取具有链接的电影。

型号:

Movie.php

public function links()
{
    return $this->hasMany('App\Movie_link', 'movie', 'id');
}

Movie_link.php

public function movie()
{
    return $this->belongsTo('App\Movie', 'movie','id')->first();
}

控制器:

我使用此代码来获取所有具有链接的电影,并且此代码有效,但我想要更有效的方法:

Movie::latest()
    ->select('id', 'title', 'poster', 'rating')
    ->whereIn('id', Movie_link::select('movie')->distinct()->pluck('movie'))
    ->wherenotnull('poster')
    ->limit(14)
    ->get()

但是我想要更高的性能,所以我想使用以下代码:

Movie::has('links')
    ->select('id', 'title', 'poster', 'rating')
    ->withCount('links')
    ->orderByDesc('id')
    ->limit(14)
    ->get()

但是使用此代码请求需要15秒!如果我将DESC更改为ASC,那就好。

1 个答案:

答案 0 :(得分:0)

如何使用联接:

Movie::query()->from('Movies as M')
              ->join('Movie_links as L', 'M.id', '=', 'L.movie')
              ->select('M.id', 'M.title', 'M.rating', 'M.poster', DB::raw('COUNT(L.id) as C'))
              ->groupBy('M.id')
              ->having('C', '>', 0)
              ->orderByDesc('M.id')
              ->limit(14)
              ->get();