错误调用数组 Laravel 上的成员函数 where()

Posted

技术标签:

【中文标题】错误调用数组 Laravel 上的成员函数 where()【英文标题】:Error Call to a member function where() on array Laravel 【发布时间】:2022-01-05 12:39:14 【问题描述】:

我想从我显示的数据中进行过滤,但是当我在数据中添加位置时出现问题。

如果 isset $request name, date 和其他我想添加的未来计划。但在这一点上受到了限制。

感谢您提前帮忙解答

    $matchs =Matchs::where('type', 'sparring')->where('status','Pending')->whereNull('deleted_at')->get()->toArray();
    $data=[];
    foreach ($matchs as $key) 
        $lawan = Matchs::where('id', $key['id'])->first()->ToArray();
        $pertandingan = Sparring::where('match_id', $key['id'])->first()->ToArray();
        $dua_arah = MatchTwoTeam::where('match_id', $key['id'])->first()->ToArray();
        $tim =  Team::where('id', $dua_arah['home_team'])->first()->ToArray();


                $transfer['name']=$tim['name'];
                $transfer['city']=$lawan['city'];
                $transfer['field_cost']=$pertandingan['field_cost'];
                $transfer['referee_cost']=$pertandingan['referee_cost'];
                $transfer['logo_path']=$tim['logo_path'];
                $transfer['nama_lapangan']=$lawan['nama_lapangan'];
                $transfer['date']=$lawan['date'];
                array_push($data,$transfer);  
        array_push($data,$pertandingan);  
    
    
    $data->where('name', 'LIKE', '%'.'football'.'%')->get()->toArray();
    $data = array_search('football', array_column($data, 'name'));
    $tittle="Sparring";
    return view('mode.sparring',[
        'tittle' => $tittle,
        'data' => $data,
    ]);

【问题讨论】:

$data 是一个数组,但您尝试在其中调用where。在循环中加载模型也是非常糟糕的做法/效率低下。您是否在 Matchs 模型中为 SparringMatchTwoTeam 设置了关系? 我没有,我用旧数据库创建了一个新项目。之前我在获取数据时遇到了问题(***.com/questions/70133457/…),希望你能帮助我这个初学者 【参考方案1】:

您试图在一个不可能的数组中调用where

正如您在代码的第一行中看到的,您正在模型类中调用where 方法。与Matchs::where('type', 'sparring') 一样,这是可能的,因为Matchs 是一个模型类。

现在,即使您使用数组,您也可以运行 where。您可以转换集合中的那一天,然后在该集合上使用数组。 如下:

collect($data)->where('name', 'football')->toArray();

这里collect()$data 数组转换为collectio,然后在collectio 中运行where() 方法,然后toArray() 将其改回数组。但不幸的是,集合类中没有like 运算符。在此处查看 Laravel 集合中可用方法的列表:https://laravel.com/docs/8.x/collections#available-methods

有一种方法可以做你想做的事。据我了解,您想要过滤 Matches ,其中 Team 名称中包含 footbal 。你可以这样做:

Matchs::where('type', 'sparring')
  ->where('status','Pending')
  ->whereNull('deleted_at')
  ->whereHas('team', function($team) 
    return $team->where('name', 'LIKE', '%'.'football'.'%')
  )
  ->get()
  ->toArray();

所以,在这里我们可以得到唯一的Mathes 具有Team 的名称包含football

似乎你是 Laravel 的新手,对你的建议很少:

    模型名称应该是单数而不是复数,所以模型类Matchs应该是Match。您的团队模型名称是 Team 是正确的。 避免使用toArray(),因为您不需要它。当您调用get() 时,它将返回集合对象,在大多数情况下,该集合比数组更具可读性和功能。 我建议使用likewhereHas 的代码只有在您在Matchs 类中正确定义了team 关系时才有效。所以,在模型中定义你的关系也很重要。如果这样做,您甚至不需要 for 循环以及该循环中其他模型中的所有 where。您可以在一个查询中完成所有关系。

【讨论】:

以上是关于错误调用数组 Laravel 上的成员函数 where()的主要内容,如果未能解决你的问题,请参考以下文章

从 Laravel 5.2 更新到 5.3 后,调用数组上的成员函数 all()

使用 laravel 请求类时,在数组错误上调用成员函数失败()

在运行 laravel phpunit testcase 时,我在 Model.php 第 1249 行收到错误“调用 null 上的成员函数 connection()”

调用数组上的成员函数 paginate()

在 laravel 资源中调用 null 上的成员函数 first()

调用字符串上的成员函数 addEagerConstraints() - Laravel 8