【问题标题】:Select only rows which relation Laravel仅选择与 Laravel 相关的行
【发布时间】:2018-07-10 19:56:18
【问题描述】:

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

型号:

电影.php

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

电影链接.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 就好了。

【问题讨论】:

  • 您需要计数吗?为什么不这样做:$movies= Movie::has('links')->orderByDesc('id')->limit(14)->get();
  • 您是否在数据库中添加了索引?
  • wherenotnull 应该是whereNotNull;有时大小写无关紧要,但为了一致性和可读性考虑更改它。
  • 当然我在电影中有id,在movie_links中有movie。我只想获取带有链接的电影。你可以看看第一个代码来得到我想要的。
  • 我通常将 get() 切换到 toSql() 和 dd() 结果。然后使用 mysql 客户端运行原始查询以调查性能或其他 mysql 查询问题。 (mysql EXPLAIN 检查使用的索引)

标签: php laravel eloquent relationship


【解决方案1】:

如何使用连接:

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

【讨论】:

  • 工作顺利!这样效率更高。
猜你喜欢
  • 2016-05-22
  • 2015-10-14
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2014-06-01
  • 1970-01-01
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多