Laravel Query Builder에서 JOIN 쿼리를 사용하여 조건을 추가하려고합니다.
<?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 Expressions를 사용할 수 있지만 SQL 삽입 지점이있을 것입니다. 쿼리 작성기로 다음을 시도했지만 생성 된 쿼리 (그리고 분명히 쿼리 결과)가 의도 한 것이 아닙니다.
$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에서 생성 한 쿼리입니다.
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
보시다시피 쿼리 출력에는 구조가 없습니다 (특히 JOIN 범위 아래). JOIN에 조건을 추가 할 수 있나요?
Laravel의 Query Builder를 사용하여 동일한 쿼리를 작성하려면 어떻게해야합니까 (가능한 경우) Eloquent를 사용하는 것이 더 낫습니까, 아니면 DB :: select를 유지해야합니까?
and arrival >= ? and arrival <= ? and departure >= ? and departure <= ?
대신 사용 되므로 약간 다릅니다AND ( r.arrival between ? and ? OR r.departure between ? and ? )
(OR
절에 주의하십시오 ). 이것은 거기에 있으면 안되는 결과에 추가 행을 추가합니다. QB를 사용하여 조인에서 모든 유형의 조건을 생성하는 것은 불가능하다고 생각합니다.