2017-02-14 3 views
1

Итак, у меня есть набор продуктов ($this->products), которые я получаю в результате запроса Model, и я хочу отфильтровать его по некоторым значениям его атрибутов , Проблема в том, что у Laravel нет такого метода, как orWhere для таких коллекций, как Eloquent для запросов к моделям. Также я хочу использовать подстановочный шаблон LIKE %{$searching_for}%, и я не уверен, как его использовать (если возможно вообще) для фильтрации моей коллекции.Laravel 5: Альтернатива для метода Eloquent 'orWhere' для запросов к коллекциям

Это код, который я пытался фильтровать свою коллекцию, с которой явно бросает Exception что orWhere метод не существует:

$products = $this->products 
     ->where("field1", "LIKE %{$searching_for}%") 
     ->orWhere("field2", "LIKE", "%{$searching_for}%") 
     ->orWhere("field3", "LIKE", "%{$searching_for}%") 
     ->orWhere("field4", "LIKE", "%{$searching_for}%"); 

Я хотел бы запросить модель напрямую, но я просто хранить $products коллекции в сеансе, поэтому я могу использовать его везде, где нужно, я не хочу слишком часто запрашивать базу данных, поэтому я ищу решение, которое каким-то образом фильтрует существующую коллекцию.

+0

Да, вам нужно написать этот тип логики самостоятельно. Используйте методы [collection] (https://laravel.com/docs/5.4/collections#available-methods) (вам, вероятно, понадобится '-> filter'), но они не предоставляют полных запросов, подобных SQL , – devk

+0

Вы пробовали '$ this-> products() -> где (...) -> orWhere (...) -> get();'? '$ this-> products' пытается получить доступ к свойству, но' $ this-> products() 'будет пытаться получить доступ к' public function products() {...} '. –

ответ

1

Подобно тому, как Saravanan предлагает делать это попробовать это:

$products = $this->products->filter(function($product) use ($searching_for) { 
    return strstr($product->field1, $searching_for) || 
      strstr($product->field2, $searching_for) || 
      strstr($product->field3, $searching_for) || 
      strstr($product->field4, $searching_for); 
}) 

Он убеждается присвоить отфильтрованную коллекцию переменной. Он также использует strstr в качестве альтернативы stripos, хотя я сомневаюсь, что это является причиной проблемы.

+0

Он работал с 'collect ($ this-> products) -> filter()' и '$ this-> products-> filter()', но не использовал 'stripos', только с' strstr', и кажется, что 'strstr' чувствителен к регистру, тогда как' stripos' не чувствителен к регистру. – Eseth

+1

Он работал с 'stristr', который является альтернативой strstr', но не чувствителен к регистру, как' stripos'. Я буду отмечать ваш ответ как принятый, так как он заставил меня использовать 'stristr'. – Eseth

4

Попробуйте использовать метод фильтрации коллекции laravel.

collect($this->products)->filter(function($value) use ($search) { 
    return (stripos($value->field1, $search) || 
     stripos($value->field2, $search) || 
     stripos($value->field3, $search) || 
     stripos($value->field4, $search)); 
}); 

Здесь $ поиск - это значение, которое вы хотели бы искать.

+0

По какой-то причине результат этого кода представляет собой пустую коллекцию, независимо от того, соответствуют ли условия поиска значениям поля или нет. Код выглядит корректно для меня, хотя ... – Eseth

+0

Ваш код был в основном верным, но ответ Spholt, основанный на вашем, решил мою проблему. В любом случае, спасибо! – Eseth

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