Я ищу в документации и в стеке несколько дней, есть ли способ передать массив с несколькими условиями, чтобы удалить запись в Laravel 4.2?
пример
Я хочу добиться чего-то вроде ниже
DELETE FROM `employees` WHERE user_id = 5 AND dept_id = 5
Для этого я могу сделать что-то вроде ниже?
$whereArray = array('user_id'=>5,'dept_id'=>5);
return DB::table('employees')->where($whereArray)->delete();
Я знаю, что могу использовать несколько, где условия для достижения этой цели. Но каждый раз, когда приходит новое условие, я должен переписать функцию. И также я не могу использовать эту функцию как динамическую.
Так, пожалуйста, помогите мне это? Как можно добиться этого с помощью массива?
Вы не можете напрямую передать массив, но вы можете обработать массив:
$whereArray = array('user_id' => 5,'dept_id' => 5);
$query = DB::table('employees');
foreach($whereArray as $field => $value) {
$query->where($field, $value);
}
return $query->delete();
Эта функциональность может быть извлечена в функцию или даже в область видимости модели, которая принимает ваш массив, строит и возвращает запрос вам.
Например, если у вас есть Employee
модель:
class Employee extends Eloquent {
public function scopeWhereArray($query, $array) {
foreach($array as $field => $value) {
$query->where($field, $value);
}
return $query;
}
}
Тогда вы могли бы сделать:
$whereArray = array('user_id' => 5,'dept_id' => 5);
return Employee::whereArray($whereArray)->delete();
Если вы хотите иметь возможность предоставлять оператора, вам просто нужно изменить формат вашего массива:
$whereArray = array(
array(
'field' => 'user_id',
'operator' => '=',
'value' => 5
),
array(
'field' => 'dept_id',
'operator' => '=',
'value' => 5
),
array(
'field' => 'salary',
'operator' => '<',
'value' => 5000
)
);
return Employee::whereArray($whereArray)->delete();
И вам нужно обновить свою функцию:
class Employee extends Eloquent {
public function scopeWhereArray($query, $array) {
foreach($array as $where) {
$query->where($where['field'], $where['operator'], $where['value']);
}
return $query;
}
}
Других решений пока нет …