2016-09-06 2 views
1

указываю где пункт:Петля где предложение?

$this->model = $model->where('published', '=', '1'); 
$this->model->get(); 

выше работает отлично, давая журнал запросов на:

select * from `products` where `published` = ?" 

Но мне нужно перебрать, где пункты из массива.

$arr = [['published', '=', '1'], ['id', '=', '1']]; 
foreach ($arr as $key => $value) { 
    $model = $model->where($value); 
} 
$model->get(); 

Но с вышеизложенным я получаю колонку, которая не найдена. Неизвестный столбец «0» в разделе «where».

Где я иду не так?

В дополнение к этому, если я просто передать весь массив, он работает:

$model = $model->where($arr); 

Предоставление журнала запросов из:

"select * from `products` where (`published` = ? and `id` = ?)" 

Но эти пункты, где в скобках ... Зачем?

+0

Я был бы прав, думая, что вы хотите передать любые значения в массиве на ваш 'where'? Например, если у вас есть '[['col', '=', 'val']]', это приведет к '$ model-> где ('col', '=', 'val')'? – Jonathon

+0

Да, это правильно, и я уже могу это сделать с помощью $ model-> where ($ arr); но проблема заключается в том, что он вызывает скобки вокруг моего предложения where. Почему это делает это и что означают скобки? – panthro

+0

Попробуйте удалить назначение так: $ model = $ model-> где (...); 'становится' $ model-> где (...); '. Это что-то делает? Вы часто получаете скобки вокруг где клаузулы, когда вы делаете что-то вроде '$ model-> где (function ($ query) {// Extra where clauses});' – Jonathon

ответ

0

Думаю, вам не хватает имени столбца.
Попробуйте это:

foreach ($arr as $key => $value) { 
    $model = $model->where($value[0],$value[1],$value[2]); 
} 
+0

Это не ассоциативный массив. – panthro

+0

@panthro извините не заметил это. Но, поскольку '$ value' сам является массивом, будет ли сделанное выше обновление? – jaysingkar

+0

Что делать, если массив не имеет 3 значений? – panthro

2

Я только что удалось получить что-то работу:

\DB::enableQueryLog(); 

$model = (new User)->newQuery(); 

$wheres = [ 
    ['forename', '=', 'Joe'], 
    ['surname', '=', 'Bloggs'], 
    ['email', '=', '[email protected]'] 
]; 

foreach ($wheres as $where) { 
    // Call $model->where(...) passing in each array item as a separate param 
    call_user_func_array([$model, 'where'], $where); 
} 

$result = $model->get(); 

dd(\DB::getQueryLog(), $result); 

В результате запроса:

select * from `users` where `forename` = ? and `surname` = ? and `email` = ? 

Трюк, казалось, добавляя ->newQuery() при создании экземпляра модели для запуска запроса.

Примечание. call_user_func_array, передавая каждый элемент массива $model->where(...). Я обнаружил, что передача массива в ->where(...) приводит к тому, что строитель пытается добавить несколько статей where. Дополнительным преимуществом использования call_user_func_array также, что она будет проходить, однако многие параметры, которые вы хотите, чтобы обеспечить в каждом пункте - не нужно быть точно 3.

2

Раствор 1

$query = new Model; 

foreach($arr as $condition){ 
    $query->where($condition[0], $condition[1], $condition[2]); 
} 

$query->get(); 

Это создаст запрос например,

Select * from table where published = 1 and id = 1; 

Здесь вы можете видеть, что значения не находятся в скобках, так как они не являются комбинированным результатом.

Решение 2

Это решение позволит создать комбинированный для того, где статьи и конечный результат будет в скобках

$query = new Model; 
$query->where(function($q) use ($arr){ 
    foreach($arr as $condition){ 
     $q->where($condition[0], $condition[1], $condition[2]); 
    } 
} 

$query->get(); 

Это приведет к точному запросу, что вы достигли.Это происходит потому, что решение расстройство того, что происходит внутри вашего запроса $ this-> модели-> где ($ обр)

Select * from table where (published = 1 and id = 1); 

ПРИМЕЧАНИЕ

Для дальнейшего узнать, почему это происходит посмотрим на следующие пример

Select * from table where (id = 2 or product_id = 3) and (publish = 1 and status = 2) 

С помощью этого запроса вы можете увидеть, что он представляет собой смесь из раствора 1 и раствора 2. вы решаете это

$query = new Model; 
$query->where(function($q) use($input) { 
    $q->where('id', '=', $input['id1']) 
     ->orWhere('id' , '=', $input['id2']); 
} 

До сих пор мы создали следующий результат

Select * from table where (id = 1 or id = 2) 

Теперь, чтобы добавить следующую часть запроса мы следующие

//continued from above 
//$query has the above condition which can be continued after the first where for chaining or in next line. 
$query->where(function($q) use($input){ 
    $q->where('publish' ,'=', 1)->where('status','=',1); 
} 

Теперь с этим, окончательный запрос становится тот, который мы обязательный. Надеюсь, теперь понятно, почему были добавлены скобки.

+0

Спасибо, просто быстрый вопрос, что делают скобки на самом деле вокруг частей предложения where? – panthro

+0

Это точно так же, как BODMAS (скобки, затем Off, затем разделение, затем умножение, затем добавление, затем вычитание). Содержимое скобок будет вычислено сначала, а затем результат будет использован для окончательного сравнения. Breakdown ** Выберите * из таблицы где (условия) и (условия) > Выберите * из таблицы true и true; ** –

Смежные вопросы