Laravel Eloquent 쿼리 빌더를 사용하고 WHERE
있으며 여러 조건 에서 절을 원하는 쿼리가 있습니다. 작동하지만 우아하지 않습니다.
예:
$results = User::where('this', '=', 1)
->where('that', '=', 1)
->where('this_too', '=', 1)
->where('that_too', '=', 1)
->where('this_as_well', '=', 1)
->where('that_as_well', '=', 1)
->where('this_one_too', '=', 1)
->where('that_one_too', '=', 1)
->where('this_one_as_well', '=', 1)
->where('that_one_as_well', '=', 1)
->get();
이 작업을 수행하는 더 좋은 방법이 있습니까, 아니면이 방법을 사용해야합니까?
답변
에서 Laravel 5.3 (그리고 현재로 여전히 진정한 7.x의 ) 당신이 배열로 전달보다 세분화 된 알의를 사용할 수 있습니다 :
$query->where([
['column_1', '=', 'value_1'],
['column_2', '<>', 'value_2'],
[COLUMN, OPERATOR, VALUE],
...
])
개인적으로 나는 여러 번의 where
전화를 통해 유스 케이스를 찾지 못했지만 실제로는 사용할 수 있습니다.
2014 년 6 월부터 배열을 where
모든 wheres
사용 and
연산자 를 원하는 한 다음과 같이 그룹화 할 수 있습니다.
$matchThese = ['field' => 'value', 'another_field' => 'another_value', ...];
// if you need another group of wheres as an alternative:
$orThose = ['yet_another_field' => 'yet_another_value', ...];
그때:
$results = User::where($matchThese)->get();
// with another group
$results = User::where($matchThese)
->orWhere($orThose)
->get();
위와 같은 쿼리가 발생합니다.
SELECT * FROM users
WHERE (field = value AND another_field = another_value AND ...)
OR (yet_another_field = yet_another_value AND ...)
답변
쿼리 범위를 사용하면 코드를보다 쉽게 읽을 수 있습니다.
http://laravel.com/docs/eloquent#query-scopes
몇 가지 예를 들어이 답변을 업데이트하십시오.
모델에서 다음과 같이 범위 메소드를 작성하십시오.
public function scopeActive($query)
{
return $query->where('active', '=', 1);
}
public function scopeThat($query)
{
return $query->where('that', '=', 1);
}
그런 다음 쿼리를 작성하는 동안이 범위를 호출 할 수 있습니다.
$users = User::active()->that()->get();
답변
다음과 같이 익명 함수에서 하위 쿼리를 사용할 수 있습니다.
$results = User::where('this', '=', 1)
->where('that', '=', 1)
->where(function($query) {
/** @var $query Illuminate\Database\Query\Builder */
return $query->where('this_too', 'LIKE', '%fake%')
->orWhere('that_too', '=', 1);
})
->get();
답변
이 경우 다음과 같은 것을 사용할 수 있습니다.
User::where('this', '=', 1)
->whereNotNull('created_at')
->whereNotNull('updated_at')
->where(function($query){
return $query
->whereNull('alias')
->orWhere('alias', '=', 'admin');
});
다음과 같은 쿼리를 제공해야합니다.
SELECT * FROM `user`
WHERE `user`.`this` = 1
AND `user`.`created_at` IS NOT NULL
AND `user`.`updated_at` IS NOT NULL
AND (`alias` IS NULL OR `alias` = 'admin')
답변
배열을 사용하는 조건 :
$users = User::where([
'column1' => value1,
'column2' => value2,
'column3' => value3
])->get();
다음과 같은 쿼리를 생성합니다.
SELECT * FROM TABLE WHERE column1=value1 and column2=value2 and column3=value3
Antonymous Function을 사용하는 조건 :
$users = User::where('column1', '=', value1)
->where(function($query) use ($variable1,$variable2){
$query->where('column2','=',$variable1)
->orWhere('column3','=',$variable2);
})
->where(function($query2) use ($variable1,$variable2){
$query2->where('column4','=',$variable1)
->where('column5','=',$variable2);
})->get();
다음과 같은 쿼리를 생성합니다.
SELECT * FROM TABLE WHERE column1=value1 and (column2=value2 or column3=value3) and (column4=value4 and column5=value5)
답변
여러 where 절
$query=DB::table('users')
->whereRaw("users.id BETWEEN 1003 AND 1004")
->whereNotIn('users.id', [1005,1006,1007])
->whereIn('users.id', [1008,1009,1010]);
$query->where(function($query2) use ($value)
{
$query2->where('user_type', 2)
->orWhere('value', $value);
});
if ($user == 'admin'){
$query->where('users.user_name', $user);
}
마침내 결과를 얻는
$result = $query->get();
답변
이 whereColumn
방법에는 여러 조건의 배열이 전달 될 수 있습니다. 이러한 조건은 and
연산자를 사용하여 결합됩니다 .
예:
$users = DB::table('users')
->whereColumn([
['first_name', '=', 'last_name'],
['updated_at', '>', 'created_at']
])->get();
$users = User::whereColumn([
['first_name', '=', 'last_name'],
['updated_at', '>', 'created_at']
])->get();
자세한 내용은 https://laravel.com/docs/5.4/queries#where-clauses 설명서의이 섹션을 확인
하십시오.