Laravel Query Builder ile bir JOIN sorgusu kullanarak bir koşul eklemeye çalışıyorum.
<?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')
);
Raw İfadeleri kullanabileceğimi biliyorum ama sonra SQL enjeksiyon noktaları olacak. Sorgu Oluşturucu ile aşağıdakileri denedim, ancak oluşturulan sorgu (ve tabii ki, sorgu sonuçları) istediğim şey değil:
$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();
Laravel tarafından üretilen sorgu şu şekildedir:
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
Gördüğünüz gibi, sorgu çıktısının yapısı yok (özellikle JOIN kapsamı altında). JOIN altında ek koşullar eklemek mümkün mü?
Laravel'in Sorgu Oluşturucusunu kullanarak aynı sorguyu nasıl oluşturabilirim (mümkünse) Eloquent kullanmak daha mı iyidir yoksa DB :: select ile kalmalı mı?
and arrival >= ? and arrival <= ? and departure >= ? and departure <= ?
bunun yerine sahip olduğu için oluşturulan sorgu biraz farklıdırAND ( r.arrival between ? and ? OR r.departure between ? and ? )
(lütfenOR
maddeye dikkat edin ). Bu, orada olmaması gereken sonuçlara ek satırlar ekler. QB kullanarak birleştirme işleminde her tür koşulu oluşturmak mümkün değil sanırım.