2017-02-14 3 views
1

모델 쿼리 결과로 얻은 제품 모음 ($this->products)이 있는데 그 중 일부 속성 값으로 필터링하려고합니다. . 문제는 Laravel에 Eloquent와 같은 콜렉션에 대해 orWhere과 같은 메소드가 없기 때문에 모델을 쿼리하는 것입니다. 또한 LIKE %{$searching_for}% 와일드 카드를 사용하고 싶습니다. 내 컬렉션을 필터링하는 데 (가능한 경우) 사용하는 방법을 모르겠습니다.Laravel 5 : 컬렉션 쿼리를위한 Eloquent의 'orWhere'방법 대신

이 분명히 발생되는 나는 내 컬렉션을 필터링하려 코드 인 방법은 존재하지 않는 ExceptionorWhere 것을 :

$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

:

$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); 
}) 

그것은 변수에 필터링 수집을 할당해야하고 있습니다. 그것은 stripos에 대한 대안으로 strstr을 사용하고 있습니다. 그러나 그 것이 문제의 원인인지 의심 스럽습니다.

+0

'collect ($ this-> products) -> filter()'와'$ this-> products-> filter()'모두 사용했지만'strstr'과 함께'stripos'를 사용하지 않았고, 'strstr'는 대소 문자를 구분하는 반면'stripos'는 대소 문자를 구분하지 않습니다. – Eseth

+1

'strstr'의 대안 인'stristr'와 함께 작동했지만'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)); 
}); 

여기서 $ search는 검색하려는 값입니다. Saravanan는이 시도하고 제안하는 방법과 유사

+0

검색 조건이 필드 값과 일치하는지 여부에 관계없이 어떤 이유로 해당 코드의 결과는 빈 컬렉션입니다. 코드는 나에게 맞아 보입니다. – Eseth

+0

코드가 대부분 정확했지만 Spholt의 답변이 내 문제를 해결했습니다. 어쨌든 고마워! – Eseth