为什么Eloquent搜索Active =?

时间:2016-05-25 18:31:48

标签: php laravel eloquent

我有两个型号,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 = ?似乎是个问题。任何想法为什么会这样?

1 个答案:

答案 0 :(得分:1)

?是一个SQL参数。 Eloquent使用PDO参数化查询,这有助于防止SQL注入。

查询本身将显示active = ?,但是当执行查询时,它会将您的值(1)绑定到此参数,并且实际执行的查询将为{{1} }。

查询很好,您只是没有得到任何结果,因为您在下载的队列中没有与符合条件的活动主机相关的任何歌曲。