【发布时间】:2016-04-09 02:30:47
【问题描述】:
我有两个模型,App\Song(属于 App\Host)和 App\Host(hasMany App\Song)。
我的控制器中有以下查询:
$songs = Song::whereHas('host', function($query) {
$query->where('skip_threshold', '>', \DB::raw('songs.attempts'))
->where('active', 1);
})
->whereNull('downloaded')
->get();
为了可重用性,我想变成一个查询范围。
我对 Eloquent 很陌生,所以我不确定这是不是正确的方法,因为它的两个模型没有返回任何结果(应该有)。
Song.php
public function scopeEligable($query)
{
$query->where('skip_threshold', '>', \DB::raw('songs.attempts'));
}
public function scopeActiveHost($query)
{
$query->where('active', 1);
}
public function scopeInDownloadQueue($query)
{
$query->whereNull('downloaded');
}
【问题讨论】:
-
控制器中用于调用这些查询范围的代码是什么? (不返回结果?)
-
Song::eligable()->activehost()->indownloadqueue()->get(); -
您应该在所有范围内都有
return..return $query->whereNull('downloaded');。范围应始终返回一个查询构建器实例。 laravel.com/docs/5.1/eloquent#query-scopes -
我已更新范围以返回查询,但仍未返回任何数据
-
你可能需要直接看一下sql。你有 DebugBar 安装吗?如果在您的查询调用之前不尝试这个... \Event::listen('illuminate.query', function($query, $params, $time, $conn) { dd(array($query, $params, $time , $conn)); });