[Laravel] Database > Query Builder > Where

[Laravel] Database > Query Builder > Where updated_at: 2024-09-06 14:37

Database > Query Builder > Where

다양한 WHERE 절 예제

일반적인 where

where column='search'

->where('column', '=', 'search')
->where('column', 'search')

OrWhere

where가 연속적으로 사용될 경우 기본 적으로 AND 로 인식된다.
따라서 or절을 사용할 경우 약간의 주의가 필요하다.
where column1='search' or column2='search'

->where('column1', '=', 'search')
->orWhere('column2', 'search')

where column1='search' or (column2 > 100 and column3 <> 'search2')

->where('column1', '=', 'search')
->orWhere(function ($query) {
  $query->where('column2', '>', 100)
  ->where('column3', '<>', 'search2');
})

where (column1 = '$var' or column2 = '$var' )

->where(function($query) use ($var){
  $query->where('column1', '=', $var)->orWhere('column2', '=', $var);
})

WhereColumn

where (table1.column >= table2.column)

->whereColumn('table1.column', '>=', 'table2.column')

orWhereColumn

where (table1.column < table2.column or table3.column = table4.column )

->Where(function ($query) {
  $query->whereColumn('table1.column', '<', 'table2.column')
  ->orWhereColumn('table3.column', '<', 'table4.column');
})

WhereRaw

mysql에서 제공하는 raw 쿼리를 사용하여도 된다.

->whereRaw('length(thread) = 2')
->whereRaw("length(reples.thread) > 1 and reples.thread like '$thread%'")
->whereRaw('p1.thread_id in (select thread_id from participants as p2 where p2.user_id = ?)', array($id))
->whereRaw('price > IF(state = "TX", ?, 100)', [200])
->whereRaw('p1.user_id <> ?', array($id))
->whereRaw('DATE(created_at) = ?', array($ymd))
->whereRaw("DATE_FORMAT(i.reg_date, '%Y-%m-%d') <= '$end_date'")
->whereRaw("(code, created_at) IN (select code, max(created_at) as created_at from TableName group by code)")
->whereRaw('(round_no + 1) NOT IN (SELECT round_no  FROM games WHERE DATE_FORMAT(created_at, "%Y-%m-%d") = "'.$ymd.'")')

WhereNull

where column is null

->whereNull('column');
->where('column', '=', NULL)

WhereNotNull

where column is not null

->whereNotNull('column')

WhereIn

where column in (1, 2, 3)

->whereIn('column', [1, 2, 3])
->whereIn(DB::raw("SUBSTRING_INDEX(`email`, '@' ,-1)"), $providers);
->whereIn('market_items.id', function($query) use($q){
  $query->select('it.item_id')
  ->from('market_item_tags as it')
  ->join('market_tags as t', function($join){
    $join->on('it.tag_id', '=', 't.id');
  })
  ->where('t.tag', $q);
});

좀더 복잡한 query에서는 WhereIn 대신 whereRaw 를 사용하여서도 In이 구현가능하다.

->whereRaw("(code, created_at) IN (select code, max(created_at) as created_at from TableName group by code)")

WhereNotIn

where column not in (1, 2, 3)

whereNotIn->whereNotIn('column', [1, 2, 3])

WhereHas

$object = Related::whereHas( function($q)
{
  $q->where('URL', 'not like', 'http%');
}
)->get()

WhereBetween

->whereBetween('posted_on', [$fromDate, $toDate])->get(); 

whereBetween의 경우 indexing문제로 인하여 속도가 늦어지는 현상이 발생한다. 따라서 아래처럼 처리하는 것이 속도면에서 유리하다.

->whereRaw("posted_on >= '".$fromDate."' AND posted_on < '".$toDate."'" )

WhereId

whereId(1) = where(id, 1) //  동일 의미

WHERE MATCH

where match against 구문은 mysql의 fulltext search에 사용되는 구문이다.
자연어 검색위주로 사용하는데 index를 걸 경우 like 문보다 좀 더 효과적으로 검색을 할 수 있다.
자세한 사용법은 이곳을 참조 바랍니다.

->whereFullText(['title', 'body'], $q)
->whereFullText(['title', 'body'], $q, ['mode'=>'boolean'])
$query = Post::query()
  ->when(request('search'), function ($query, $search) {
    $query->whereFullText(['title', 'body'], $search);
  }, function ($query) {
    $query->latest();
  });
평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글