SQL / Laravel - 为什么我的查询返回一个空集合?

时间:2017-06-28 07:58:25

标签: mysql sql laravel laravel-query-builder

我的Laravel查询生成器返回一个空集合,而SQL字符串本身在phpmyadmin中执行时返回正确的记录。

这是我的代码:

$times = Time::join(\DB::raw('(SELECT `ath_id`, `stroke_id`, MIN(time) AS time FROM times GROUP BY ath_id, stroke_id) b'), function($join) {
                 $join->on('times.ath_id', '=', 'b.ath_id')
                      ->where('times.stroke_id', '=', 'b.stroke_id')
                      ->where('times.time', '=', 'b.time');
             })
             ->where('times.ath_id', '=', $id)
             ->orderBy('times.stroke_id', 'ASC')
             ->orderBy('times.date', 'DESC');
dd($times->get());

下面是在phpmyadmin中工作的sql,但不包含laravel查询构建器。此外,这是使用dd($times->toSql());时返回的SQL字符串(其中$times->getBindings()返回['b.stroke_id', 'b.time', '4298584']来填写问号?

SELECT * FROM `times`
INNER JOIN (SELECT `ath_id`, `stroke_id`, MIN(time) AS time
            FROM times GROUP BY ath_id, stroke_id) b
ON `times`.`ath_id` = `b`.`ath_id`
    ADN `times`.`stroke_id` = b.stroke_id -- ?
    AND `times`.`time` = b.time -- ?
WHERE `times`.`ath_id` = 4298584 -- ?
ORDER BY `times`.`stroke_id` asc, `times`.`date` desc

1 个答案:

答案 0 :(得分:1)

这有点儿"棘手"。你在phpmyadmin中执行的查询确实是正确的。但是,Laravel使用where()on()的方式不同。

使用值where()和使用列时on()

$times = Time::join(\DB::raw('(SELECT `ath_id`, `stroke_id`, MIN(time) AS time FROM times GROUP BY ath_id, stroke_id) b'), function($join) {
                 $join->on('times.ath_id', '=', 'b.ath_id')
                      ->on('times.stroke_id', '=', 'b.stroke_id')
                      ->on('times.time', '=', 'b.time');
             })
             ->where('times.ath_id', '=', $id)
             ->orderBy('times.stroke_id', 'ASC')
             ->orderBy('times.date', 'DESC');

文档:https://laravel.com/docs/5.4/queries,部分(CTRL + F):高级加入

  

如果您想使用"其中"您的联接上的样式子句,您可以在联接上使用whereorWhere方法。这些方法不是比较两列,而是将列与值进行比较。

更明确一点:

$join->on('times.ath_id', '=', 'b.auth_id')->where('times.stroke_id', '=','b.stroke_id');

结果:

JOIN on `times`.`ath_id` = `b`.`auth_id` WHERE `times`.`stroke_id` = 'b.stroke_id' -- AS STRING

toSql()返回您的查询并且您认为Laravel知道:

时出现了混淆
['b.stroke_id', 'b.time', '4298584']

前两个绑定绑定是列。但where()认为他们只是串起来。