본문 바로가기

Server/PHP

[MySQL & Laravel Query Builder] 쿼리빌더를 사용한 union

차량 이력 조회를 위해 rent 테이블과 새로 생성한 status_log 테이블을 union함

결과 조회를 위해 쿼리문이 조금 길어졌는데

 

// 차량 이력 공통쿼리

function carStatusLogQuery($vin_number, $code){

$query = DB::table('mn_rent')

->where('car_vin_number', $vin_number)

->where('rent_status', $code)

->selectRaw('ID,

car_number,

car_vin_number,

"시스템 변경" as reason,

"system" as admin_id');

return $query;

}

 

public function getCarStatusLog($vin_number){

 

// 구독(운행중) 차량이력

$rentQuery = $this->carStatusLogQuery($vin_number, '02')

->addSelect('rent_start as regist_date', 'rent_status as car_status');

 

// 구독완료(구독) 차량이력

$rentEndAttQuery = $this->carStatusLogQuery($vin_number, '03')

->addSelect('rent_start as regist_date', 'rent_status as car_status');

 

// 구독완료(대기중) 차량이력

$rentEndQuery = $this->carStatusLogQuery($vin_number, '03')

->addSelect(DB::raw(

'if( rent_end>rent_change_cancel_date, rent_end, ifnull(rent_change_cancel_date, rent_end) ) as regist_date,

if( true, "01", "")

'));

 

// rent_status 상태값& car_status 값 조율 필요

// 예약상태는 차량 구독/변경시 log에 저장

// 결제완료&렌트종료 상태만 받아와서 계산해야 할 것 같음

// 03 = 렌트종료.. 필요?

 

$resultQuery = DB::table('mn_log_car_status')

->select('*')

->where('car_vin_number', $vin_number)

->unionAll($rentQuery)

->unionAll($rentEndAttQuery)

->unionAll($rentEndQuery);

 

if($resultQuery->count()==0)

return false;

else

return $resultQuery->get();

}

 

구독완료 상태에서 구독중, 대기중 차량이력 구분이 좀 번거로웠다.

아직 테스트중, 더 나은 방안이 있으면 수정보완 하기로

 

+) 유니온은 칼럼 명을 지정해도 순서가 정해져있어서 칼럼 순서가 바뀔 경우 데이터도 유니온을 실행하는 테이블 기준으로 들어가서 매우 몹시 번거롭다. 배고프다