쿼리 빌더 체이닝
$userOfType = DB::table('users')
->where('type', $type)
->get();
쿼리 결과 제약 메서드
#select()
$emails = DB::table('contacts')
->select('email', 'email2 as second_email')
->get();
// 또는
$emails = DB::table('contacts')
->select('email')
->addSelect('email2 as second_email')
->get();
#like
$users = DB::table('users')
->where('name', 'like', 'T%')
->get();
#where
$newContacts = DB::table('contact')
->where('created_at', '>', now()->subDay())
->get();
# where 사용시 비교 연산자 = 는 생략이 가능하다 이때 파라미터 2개만 전달
$vipContacts = DB::table('contacts')->where('vip', true)->get();
#where 구문 여러 개 적용
$newVips = DB::table('contacts')
->where('vip', true)
->where('created_at', '>', now()->subDay());
// 또는
$newVips = DB::table('contacts')->where([
['vip', true],
['created_at', '>', now()->subDay()],
]);
#간단한 or where
$priorityContacts = DB::table('contacts')
->where('vip', true)
->orWhere('created_at', '>', now()->subDay())
->get();
#복잡한 or where
$contacts = DB::table('contacts')
->where('vip', true)
->orWhere(function ($query){
$query->where('created_at', '>', now()->subDay())
->where('trial', false);
});
#조건이 and 라면
$canEdit = DB::table('users')
->where('admin', true)
->orWhere(function ($query){
$query->where('plan', 'premium')
->where('is_plan_owner', true);
})->get();
//SELECT * FROM users WHERE admin = 1 OR (plan = 'premium' AND is_plan_owner = 1);
#whereBetween(colName, [low, High])
$mediumDrinks = DB::table('drinks')
->whereBetween('size', [6, 12])
->get();
#whereIn(colName, [1, 2, 3])
$closeBy = DB::table('contacts')
->whereIn('state', ['FL', 'GA', 'AL'])
->get();
#whereNotIn() 을 사용하면 포함되지 않은 레코드를 반환한다.
#whereRaw() 이 메서드는 전달되는 문자열을 이스케이프 처리하지 않고 바로 where 구문 뒤에 추가
#SQL 인젝션 공격에 주의
$goodfs = DB::table('contacts')->whereRaw('id = 12345')->get();
#whereExists() 서브쿼리
$commenters = DB::table('users')
->whereExists(function($query){
$query->select('id')
->from('comments')
->whereRaw('comments.user_id = user.id');
});
#distinct() 데이터가 고유할 떄만 반환
$lastNames = DB::table('contacts')->select('city')->distinct()->get();
#orderBy(colName, directrion)
$contacts = DB::table('contacts')
->orderBy('last_name', 'asc')
->get();
#groupBy(), having(), havingRaw()
$populousCities = DB::table('contacts')
->groupBy('city')
->havingRaw('count(contact_id) > 30')
->get();
#skip(), 과 take() 페이지 처리에서 주로 사용
//31~40번째 레코드 반환
$page4 = DB::table('contacts')->skip(30)->take(10)->get();
#latest(colName) 와 oldset(colName)
전달된 칼럼을 기준으로 결과를 정렬. 칼럼명을 지정하지 않으면 기본적으로
created_at 칼럽이 사용된다. latest() 는 내림차순, oldest()은 오름차순으로
정렬한다.
#inRandomOrder() 은 쿼리 결과를 임의의 순서로 정렬한다.
#when() 조건에 따라 쿼리를 추가하는 메서드
첫번째 파라미터가 true 이면 두 번째 파라미터로 전달된 클로저를 실행
$status 값이 True 이면 status 조건식을 수행
아래 조건에서는 $ignoreDrafts 값이 True 이면 draft 가 False인 조건식을 수행
unless() 메서드는 when() 메서드의 반대 개념으로 조건값이 False 이면 두 번째 파라미터로
전달되는 클로저가 실행된다.
$status = request('status'); // status 값이 전달되지 않는다면 null 값이 된다.
$posts = DB::table('posts')
->when($status, function($query) use ($status){
return $query->where('status', $status);
})->get();
// 또는
$posts = DB::table('posts')
->when($ignoreDrafts, function ($query){
return $query->where('draft', 'false');
})->get();
생성되는 쿼리 찍어보기
#dd() 와 dump() 생성되는 sql 쿼리와 바인딩되는 변수를 출력
#dd() 를 사용하는 경우 스크립트를 종료한다
DB::table('users')->where('name', 'Wilbur Powery')->dd();
//"selct * from "users" where "name" = ?"
//array:1 [0 => "Wilbur Powery]
쿼리빌더 마지막 필수 메소드
#get() 쿼리를 실행하고 결과를 반환
$contacts = DB::table('contacts')->get();
$vipContacts = DB::table('contacts')->where('vip', true)->get();
#first() 와 firstOrFail()
#first() 메서드는 get()과 같이 결과를 반환하지만 LIMIT 1 이 추가된 것과 같이 작동한다.
$newestContact = DB::table('contacts')
->orderBy('created_at', 'desc')
->first();
#first() 는 결과가 존재하지 않을 경우 False 를 반환
#firstOrFail() 메서드는 예외를 발생
#find($id)와 findOrFail($id)
$contactFive = DB::table('contacts')->find(5);
#find() 는 결과가 존재하지 않을 경우 False 를 반환
#findOrFail() 메서드는 예외를 발생
#value() 첫 번째 레코드에서 지정된 칼럼값만 반환 first() 와 비슷하지만 하나의
#컬럼 값만 확인할 때 사용
$newestContactEmail = DB::table('contacts')
->orderBy('created_at', 'desc')
->value('email');
#count() 쿼리 조건에 일치하는 레코드의 수를 반환
$countVips = DB::table('contacts')
->where ('vip', true)
->count();
#min() 과 max()
주어진 칼럼의 값 중에서 최소값과 최대값을 반환
$highestCost = DB::table('orders')->max('amount');
#sum()과 avg() 주어진 칼럼의 값과 합의 평균값을 구한다
$averageCost = DB::table('orders')
->where('status', 'completed')
->avg('amount');
원시쿼리 작성
$contacts = DB::table('contacts')
->select(DB::raw('*, (score * 100) AS integer_score'))
->get();
조인쿼리
#이너조인을 생성
$users = DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->select('users.*', 'contacts.name', 'contacts.status')
->get();
#leftJoin()메서드를 사용해 레프트조인을 구성할 수도 있다.