Eine VERKNÜPFUNG Mit Zusätzlichen Bedingungen Mithilfe von Query Builder oder Eloquent
Ich versuche, fügen Sie eine Bedingung mit einer JOIN-Abfrage mit Laravel Abfrage-generator.
<?php
$results = DB::select('
SELECT DISTINCT
*
FROM
rooms
LEFT JOIN bookings
ON rooms.id = bookings.room_type_id
AND ( bookings.arrival between ? and ?
OR bookings.departure between ? and ? )
WHERE
bookings.room_type_id IS NULL
LIMIT 20',
array('2012-05-01', '2012-05-10', '2012-05-01', '2012-05-10')
);
Ich weiß, dass ich verwenden können, Raw-Ausdrücke aber dann gibt es SQL-injection-Punkte. Ich habe versucht, die folgenden mit Query-Builder, aber die generierte Abfrage (und es ist offensichtlich, Abfrage-Ergebnisse) nicht, was ich beabsichtigte:
$results = DB::table('rooms')
->distinct()
->leftJoin('bookings', function ($join) {
$join->on('rooms.id', '=', 'bookings.room_type_id');
})
->whereBetween('arrival', array('2012-05-01', '2012-05-10'))
->whereBetween('departure', array('2012-05-01', '2012-05-10'))
->where('bookings.room_type_id', '=', null)
->get();
Dies ist die generierte Abfrage von Laravel:
select distinct * from `room_type_info`
left join `bookings`
on `room_type_info`.`id` = `bookings`.`room_type_id`
where `arrival` between ? and ?
and `departure` between ? and ?
and `bookings`.`room_type_id` is null
Wie Sie sehen können, die Ausgabe der Abfrage nicht mit der Struktur (vor allem unter JOIN-scope). Ist es möglich, zusätzliche Bedingungen BEITRETEN?
Wie kann ich die gleiche Abfrage mit Laravel ist der Abfrage-generator (wenn möglich) Ist es besser, Eloquenter, oder bleiben sollte, mit DB::select?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht ganz sicher, ob die zwischen-Klausel Hinzugefügt werden können, um die join-in laravel.
Hinweise:
DB::raw()
weist Laravel nicht wieder zitiert.on()
hinzufügenAND
Zustand undorOn()
hinzufügenOR
Zustand.and arrival >= ? and arrival <= ? and departure >= ? and departure <= ?
stattAND ( r.arrival between ? and ? OR r.departure between ? and ? )
(bitte beachten Sie dieOR
- Klausel). Dies fügt zusätzliche Zeilen zum Ergebnis, dass nicht dort sein sollte. Ich denke, es ist nicht möglich, generieren Sie alle Arten von Bedingungen in der Verknüpfung mit QB.Repliziert werden können diese Klammern in der left join:
ist
Werden Sie dann stellen müssen, um die Bindungen, die später mit "setBindings" wie beschrieben in diesem post SO:
Wie man bind-Parameter, um eine raw-DB-Abfrage in Laravel verwendet, die auf einem Modell?
Es ist nicht schön aber es funktioniert.
Wenn Sie einige params, können Sie dies tun.
und dann wieder Ihre Abfrage
return $Ergebnis;
Die sql-query-Beispiel wie diese
Laravel join mit mehreren Bedingungen
Ich bin mit laravel5.2 und wir können hinzufügen, Verknüpfungen mit verschiedenen Optionen, die Sie ändern können wie pro Ihre Anforderung.
Gibt es einen Unterschied zwischen den raw-Abfragen und standard wählt (zwischen den
DB::raw
undDB::select
Methoden).Können Sie tun, was Sie wollen mit einer
DB::select
und einfach fallen in der?
Platzhalter viel wie Sie tun, mit vorbereiteten Aussagen (es ist eigentlich das, was es tut).Ein kleines Beispiel:
Der zweite parameter ist ein array von Werten, die verwendet werden, um ersetzen Sie die Platzhalter in der Abfrage von Links nach rechts.
$join->on('winners.year','=',DB::select('?',array('2013'));
aber hat nicht funktioniert.