我有两个型号,App \ Song(belongsTo App \ Host)和App \ Host(hasMany App \ Song)。
在我的控制器中,我使用以下查询:
$songs = Song::whereHas('host', function($query) {
$query->eligable()->activeHost();
})->inDownloadedQueue()->get();
这是从我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');
}
这不会返回任何结果,转向->toSql()
函数来调试查询如下:
select * from "songs" where exists (select * from "hosts" where "songs"."host_id" = "hosts"."id" and "skip_threshold" > songs.attempts and "active" = ?) and "downloaded" is null
这host = ?
似乎是个问题。任何想法为什么会这样?
答案 0 :(得分:1)
?
是一个SQL参数。 Eloquent使用PDO参数化查询,这有助于防止SQL注入。
查询本身将显示active = ?
,但是当执行查询时,它会将您的值(1
)绑定到此参数,并且实际执行的查询将为{{1} }。
查询很好,您只是没有得到任何结果,因为您在下载的队列中没有与符合条件的活动主机相关的任何歌曲。