[Laravel] Database > Query Builder > Where
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();
});