2017-05-11 1 views
1

Laravel Collection 검색 기능을 사용할 때 항상 false를 반환합니다.Laravel Eloquent Collection 검색은 항상 false를 반환합니다.

코드 :

$entries = Entry::all(); 
$results = $entries->search('Jack', true); 
dd($results); 

출력 : false

출력 DD ($ 항목) :

무서운 형식에 대한
Collection {#218 ▼ 
    #items: array:9 [▼ 
    0 => Entry {#219 ▼ 
     #fillable: array:2 [▶] 
     #connection: "mysql" 
     #table: null 
     #primaryKey: "id" 
     #keyType: "int" 
     +incrementing: true 
     #with: [] 
     #perPage: 15 
     +exists: true 
     +wasRecentlyCreated: false 
     #attributes: array:5 [▶] 
     #original: array:5 [▶] 
     #casts: [] 
     #dates: [] 
     #dateFormat: null 
     #appends: [] 
     #events: [] 
     #observables: [] 
     #relations: [] 
     #touches: [] 
     +timestamps: true 
     #hidden: [] 
     #visible: [] 
     #guarded: array:1 [▶] 
    } 
    1 => Entry {#220 ▶} 
    2 => Entry {#221 ▶} 
    3 => Entry {#222 ▶} 
    4 => Entry {#223 ▶} 
    5 => Entry {#224 ▶} 
    6 => Entry {#225 ▶} 
    7 => Entry {#226 ▶} 
    8 => Entry {#227 ▶} 
    ] 
} 

죄송합니다.

+0

는'DD ($ 항목)'와 그 결과를 게시 할 수 있습니까? – Ian

답변

0

search() 방법으로 간단한 컬렉션을 사용해야합니다. 당신이 이름을 검색 할 경우에 따라서,이 작업을 수행 : 처음 검색을 할 것입니다 후 메모리에 모든 항목을로드하고 있기 때문에

$entries = Entry::pluck('name'); 
$results = $entries->search('Jack'); 

BTW, 이것은 검색을 할 수있는 정말 나쁜 방법입니다.

훨씬 더 좋은 방법은 웅변이나 쿼리 빌더를 사용하는 것입니다 : 단순히

$results = Entry::where('name', 'like', '%'.$name.'%')->get(); 

또는 :

$results = Entry::where('name', $name)->get(); 

당신이 전체 이름을 검색 할

.

+0

이름 열을 검색하고 싶을 때만 괜찮습니다.하지만 하나의 검색 필드를 사용하여 주어진 데이터의 모든 항목을 검색하려고합니다. – TenTimesCake

+0

@TenTimesCake 다음에 여러 개의 orWhere() 절을 추가하십시오. 모든 데이터를로드 한 다음'search()'콜렉션 메소드를 사용하는 것은 끔찍한 생각입니다. –

0

당신은 항상 Laravel 컬렉션의 filter() 기능을 사용할 수 있습니다 :

$matchingRecords = $allRecords->filter(function($key, $record){ 
    return $record->name == "Jack"; 
}); 

대안은 발견 첫째, 또는 search()에 결과를 제한 할 수 first() 기능입니다.

자세한 내용은 https://laravel.com/docs/5.4/collections#available-methods을 확인하십시오.