쿼리 빌더 체이닝


$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()메서드를 사용해 레프트조인을 구성할 수도 있다.