sql >> Database teknologi >  >> RDS >> Mysql

SQL/Laravel - Hvorfor returnerer min forespørgsel en tom samling?

Det er noget lidt "tricky". Forespørgslen du udfører i phpmyadmin er faktisk korrekt. Laravel bruger dog where() og on() anderledes.

Brug where() med en værdi og on() når du arbejder med kolonner.

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

Docs:https://laravel.com/docs/5.4/queries , sektion (CTRL+F):Avancerede joinforbindelser

For at gøre det lidt tydeligere:

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

resulterer i:

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

Forvirringen opstod, da toSql() returnerede din forespørgsel, og du antog, at Laravel ved det:

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

de første to bindingsbindinger er kolonner. Men where() tror, ​​at de bare snor.




  1. En oversigt over de nye lagrede procedurer i PostgreSQL 11

  2. Generering af rækkefølge i rækkefølge

  3. Oracle 11g - Find poster i en CLOB med Carriage Return Line Feed

  4. Få top 10 produkter for hver kategori