2016-09-24 2 views
0

Я пытаюсь реализовать поиск в Laravel. Я хочу искать на моделях. Поскольку в базе данных может быть много записей, я пытаюсь использовать функцию chunk.Laravel: Внешняя переменная в обратном вызове для куска

public function searchLeads($param) 
    { 
     $results = array(); 

     // get all leads 
     Lead::chunk(100, function($leads) use ($results, $param) { 
      // search in name 
      $results = array_merge($results, $this->repository->searchInName($leads, $param)); 

      // search in email 
      $results = array_merge($results, $this->repository->searchInEmail($leads, $param)); 

      // and so on ... 
    } 

    // eliminate duplicates 
    $collection = collect($results); 
    $collection = $collection->unique(); 

    $results = $collection->all(); 

    dd($results); 
    // return $results; 
} 

Примечание: searchIn... функции возвращают массив результатов и работают, как ожидалось.

Когда я пытаюсь выполнить приведенный выше код, я получаю пустой массив. Поэтому я изменил следующую строку (добавлена ​​ссылка & на номер $results).

Lead::chunk(100, function($leads) use (&$results, $param) { 

Теперь я получаю ожидаемый результат.

вопрос есть, я наткнулся на правильное решение, или мне не хватает чего-то, что может привести к ошибкам в коде?

Примечание: Я знаю, используя where clause - лучший и эффективный способ; но для этого я не могу использовать where.

ответ

1

Я получил решение после прочтения немного о php closures. Мое реальное беспокойство состояло в том, что я не использую массив $results правильно.

Но после прочтения php docs, я знаю, что делаю это правильно.

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

0

использовать поиск, вы могли бы сделать что-то вроде:

$results = Lead::where('mail','like', $param)->orWhere('name','like', $param)->get(); 

затем MySQL делает поиск, который я считаю, это fastes способ сделать это.

в зависимости от того, как поиск должно быть сделано:

...where('mail','like', %$param%)... 

https://laravel.com/docs/5.1/queries#where-clauses

еще попытаться описать то, что конечная цель вашего поиска является?

+0

Что вы предлагаете правильно. Но это не то, что я хотел спросить. Это моя вина; Я не уточнил себя в вопросе. Я не могу использовать where clauses, поскольку поиск выполняется по производным и связанным с ним полям, которые не могут быть напрямую преобразованы в SQL-запрос. – linuxartisan

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