2016-09-24 9 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

あなたの提案は正しいです。しかし、それは私が求めていたものではありません。それは私のせいです;私はその質問で自分自身を明確にしなかった。 SQLクエリに直接変換できない派生フィールドや関連フィールドで検索が実行されているため、where節は使用できません。 – linuxartisan

関連する問題