Laravel:块中回调的外部变量

时间:2016-09-24 05:12:07

标签: php laravel laravel-5

我正在尝试在Laravel中实施搜索。我想搜索模型。 由于数据库中可能有很多记录,我正在尝试chunk函数。

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

2 个答案:

答案 0 :(得分:1)

我在阅读了一些关于php closures的内容后得到了解决方案。我真正担心的是我没有正确使用$results数组。

但在阅读php docs之后,我知道我正确地做到了这一点。

请注意我知道where条款,它的用法在这里会更有效率。但这不是我想要问的问题。

答案 1 :(得分:0)

要使用搜索,您可以执行以下操作:

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

然后mysql进行搜索,我认为这是一种很好的方式。

取决于搜索应该如何完成:

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

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

否则尝试描述搜索的最终目标是什么?