【问题标题】:why getting "array_map(): Argument #2 should be an array" error while running complex query?为什么在运行复杂查询时出现“array_map(): Argument #2 should be an array”错误?
【发布时间】:2017-11-07 22:19:43
【问题描述】:

我正在编写过滤器搜索代码,其中用户从 3 个复选框的列表中选择至少一个选项,然后我必须为所选选项(复选框)编写查询。如果我尝试运行我的代码,那么我会得到“array_map(): Argument #2 should be an array”。

我的表格是:

<form id="statistics" method="post" action="{{ action('MyController@store') }}"">
<div class="form-group">
 <label><input type="checkbox" value="suppliers" name="suppliers">suppliers</label>
</div>
<div class="form-group">
 <label><input type="checkbox" value="campaign" name="campaign">campaign</label>
</div>
<div class="form-group">
 <label><input type="checkbox" value="clients" name="clients">clients</label>
</div>
<div class="form-group">
 <label for="start_date">From:</label><input type="text" name="startdate" id="startdate">
</div>
<div class="form-group">
 <label for="start_date">From:</label><input type="text" name="enddate" id="enddate">
</div>
<div class="form-group">
 <button type="submit" id="process" class="btn btn-primary submit">Run Report</button>
</div>

我的查询如下:

if($request->suppliers == 'suppliers'){
        $results->leftjoin('suppliers AS s', 's.id', '=', 'l.supplier_id')
                ->select('s.name AS Supplier')
                ->groupBy('s.name')
                ->orderBy('s.name');
    }
if($request->campaign == 'campaign'){
        $results->leftjoin('campaigns AS c', 'c.id', '=', 'l.campaign_id')
                ->select('c.name AS Campaign')
                ->groupBy('c.name')
                ->orderBy('c.name');
    }
if($request->clients == 'clients'){
        $results->leftjoin('clients AS cl', 'cl.id', '=', 'l.client_id')
                ->groupBy('cl.name')
                ->orderBy('cl.name');
    }
$results->whereBetween('l.received', [$start, $end])
        ->groupBy('l.disposition')         
        ->orderBy('l.disposition')
        ->get()->toArray();
$count = count($results);
if($count > 0)
{
 $results = array_map(function ($value) {
            return (array)$value;
        }, $results); 
 Excel::create('Statistics', function($excel) use($results) {
            $excel->sheet('Statistics', function($sheet) use($results) {
                $sheet->fromArray($results);
            });
        })->download('csv');
    }

如果我运行上面的代码,则会收到类似 "array_map(): Argument #2 should be an array"

之类的错误

正常查询如下:

$results = DB::table('lead_audit AS l')
         ->leftjoin('suppliers AS s', 's.id', '=', 'l.supplier_id')
         ->leftjoin('campaigns AS c', 'c.id', '=', 'l.campaign_id')
         ->select('s.name AS Supplier', 'c.name AS Campaign', 'l.disposition AS Disposition')
         ->whereBetween('l.received', [$start, $end])
         ->groupBy('s.name', 'c.name', 'l.disposition')
         ->orderBy('s.name')
         ->orderBy('c.name')
         ->orderBy('l.disposition')
         ->get()->toArray();
$count = count($results);

谁能帮我解决这个问题,谢谢。

【问题讨论】:

    标签: mysql search filter laravel-5.4 laravel-query-builder


    【解决方案1】:

    看起来 $results 只是一个查询而不是一个数组。你需要改成下面的代码

    $queryResults = $results->whereBetween('l.received', [$start, $end])
        ->groupBy('l.disposition')         
        ->orderBy('l.disposition')
        ->get()->toArray();
    $count = count($results);
    if($count > 0)
    {
     $results = array_map(function ($value) {
                return (array)$value;
            }, $results); 
    

    到下面的代码

    $results->whereBetween('l.received', [$start, $end])
        ->groupBy('l.disposition')         
        ->orderBy('l.disposition')
        ->get()->toArray();
    $count = count($results);
    if($count > 0)
    {
     $results = array_map(function ($value) {
                return (array)$value;
            },$queryResults);
    

    在上面的代码中,我将查询结果赋值给变量$queryResults,然后将它传递给array_map函数。

    【讨论】:

    • 感谢@PhongTran 的工作就像一个魅力。我是 laravel 5.4 的新手,所以我遇到了问题。这是我的一个很小的错误,但我已经浪费了 1 天时间。我想知道像我这样的其他开发人员是否也面临这种类型的问题..!!!总之非常感谢。干杯。
    • @prasadchinthala 我在开始使用 Laravel 时也遇到了这个问题,我的建议是当你得到意想不到的结果时使用 dd() 进行调试。 laravel.com/docs/5.4/helpers#method-dd
    • 谢谢仅供参考。感谢 Stackoverflow 是一个非常适合开发人员的博客。乐于助人。快乐编码@PhongTran
    猜你喜欢
    • 2018-12-19
    • 2023-02-13
    • 2020-02-19
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2021-01-26
    相关资源
    最近更新 更多