Ich versuche, eine Bedingung mithilfe einer JOIN-Abfrage mit Laravel Query Builder hinzuzufügen.
<?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 Raw Expressions verwenden kann, aber dann gibt es SQL-Injection-Punkte. Ich habe mit Query Builder Folgendes versucht, aber die generierte Abfrage (und natürlich die Abfrageergebnisse) sind nicht das, was ich beabsichtigt habe:
$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 von Laravel generierte Abfrage:
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, hat die Abfrageausgabe nicht die Struktur (insbesondere im Bereich JOIN). Ist es möglich, unter JOIN zusätzliche Bedingungen hinzuzufügen?
Wie kann ich dieselbe Abfrage mit Laravels Query Builder erstellen (falls möglich)? Ist es besser, Eloquent zu verwenden, oder sollte ich bei DB :: select bleiben?
and arrival >= ? and arrival <= ? and departure >= ? and departure <= ?
stattdessen die Join-Bedingung giltAND ( r.arrival between ? and ? OR r.departure between ? and ? )
(beachten Sie dieOR
Klausel). Dies fügt zusätzliche Zeilen hinzu, die nicht vorhanden sein sollten. Ich denke, es ist nicht möglich, alle Arten von Bedingungen in Join mit QB zu generieren.Sie können diese Klammern im linken Join replizieren:
ist
Sie müssen die Bindungen später mit "setBindings" festlegen, wie in diesem SO-Beitrag beschrieben: Wie binde ich Parameter an eine unformatierte DB-Abfrage in Laravel, die für ein Modell verwendet wird?
Es ist nicht schön, aber es funktioniert.
quelle
Wenn Sie einige Parameter haben, können Sie dies tun.
und geben Sie dann Ihre Anfrage zurück
$ results zurückgeben;
quelle
Das SQL-Abfragebeispiel sieht so aus
Laravel verbindet mit mehreren Bedingungen
quelle
Ich verwende laravel5.2 und wir können Verknüpfungen mit verschiedenen Optionen hinzufügen, die Sie gemäß Ihren Anforderungen ändern können.
quelle
Es gibt einen Unterschied zwischen den Rohabfragen und den Standardauswahlen (zwischen den Methoden
DB::raw
undDB::select
).Sie können tun, was Sie wollen, indem Sie ein verwenden
DB::select
und einfach den?
Platzhalter einfügen, ähnlich wie bei vorbereiteten Anweisungen (es ist tatsächlich das, was es tut).Ein kleines Beispiel:
Der zweite Parameter ist ein Array von Werten, mit denen die Platzhalter in der Abfrage von links nach rechts ersetzt werden.
quelle
$join->on('winners.year','=',DB::select('?',array('2013'));
aber es hat nicht funktioniert.