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.