Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL/Laravel - Pourquoi ma requête renvoie-t-elle une collection vide ?

C'est quelque chose d'un peu "délicat". La requête que vous exécutez dans phpmyadmin est en effet correcte. Cependant, Laravel utilise where() et on() différemment.

Utilisez where() avec une valeur et on() lorsque vous travaillez avec des colonnes.

$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');

Documents :https://laravel.com/docs/5.4/queries , section (CTRL+F) :Jointures avancées

Pour clarifier un peu :

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

donne :

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

La confusion est venue quand toSql() renvoyé votre requête et vous avez supposé que Laravel sait que :

['b.stroke_id', 'b.time', '4298584']

les deux premières liaisons de liaison sont des colonnes. Mais where() pense qu'ils ne font que des cordes.