Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL/Laravel - Warum gibt meine Abfrage eine leere Sammlung zurück?

Das ist etwas "tricky". Die Abfrage, die Sie in phpmyadmin ausführen, ist in der Tat korrekt. Laravel verwendet jedoch where() und on() anders.

Verwenden Sie where() mit einem Wert und on() beim Arbeiten mit Spalten.

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

Dokumente:https://laravel.com/docs/5.4/queries , Abschnitt (STRG+F):Erweiterte Verknüpfungen

Um es etwas klarer zu machen:

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

ergibt:

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

Die Verwirrung kam, als toSql() hat Ihre Abfrage zurückgegeben und Sie haben angenommen, dass Laravel weiß das:

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

Die ersten beiden Bind-Bindungen sind Spalten. Aber where() denkt, dass sie nur Saiten.