【发布时间】:2018-07-10 19:56:18
【问题描述】:
我在仅选择具有关系的行时遇到问题。我尝试了许多不同的解决方案。我有 2 张桌子 Movies 和 Movie_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