Php 使用即时加载过滤结果

Php 使用即时加载过滤结果,php,laravel-5,Php,Laravel 5,我正在laravel中为API创建搜索,但搜索结果错误。我正在尝试按位置和食物类型搜索。我有以下表格: 食物 商店 食品店 使用者 评论 这是我的搜索代码: public function searchShop($food, $location) { // if($food == " " || $location == " "){ return $this->index(); } //get all records where city

我正在laravel中为API创建搜索,但搜索结果错误。我正在尝试按位置和食物类型搜索。我有以下表格:

  • 食物
  • 商店
  • 食品店
  • 使用者
  • 评论
  • 这是我的搜索代码:

     public function searchShop($food, $location)
    {
        //
        if($food == " " || $location == " "){
            return $this->index();
        }
    
        //get all records where city and food are equal to
        $shops = Shop::where('city', '=', $location)
            ->with('comments.user')
            ->with(['foods'=> function($query) use($food){
                    $query->where('name','=', 'fish pepper'); }])
            ->get();
    
            //check if empty and return all
            if($shops->isEmpty()){
                return $this->index();
            }
    
        return $shops;
    }
    

    我的结果是下面的结果,而不仅仅是位置和食物的记录,它显示了按位置过滤的所有商店,即使食物不匹配:

    您正在使用的
    with
    方法不会按照您认为的方式进行过滤。您的代码实际上过滤了食物结果,告诉Elounting检索所有
    商店
    ,或者不检索食物,或者检索名为
    鱼椒
    的食物。这称为约束急切负载

    您正在寻找的方法是
    whereHas
    ,而不是
    with
    。这称为查询关系是否存在

    $shops = Shop::where('city', '=', $location)
        ->with('comments.user')
        ->whereHas('foods', function($query) use($food){
            $query->where('name','=', 'fish pepper'); 
        })
        ->get();
    
    现在,这将只返回具有名称为“鱼椒”的相应食品条目的
    商店

    如果内存可用,
    whereHas
    实际上不会为您填充
    食物
    ,但在这种情况下,您不需要它,因为可以安全地假设它们都有
    鱼椒
    。如果您确实想提取所有食物,请将
    with('comments.user')
    更改为
    with(['comments.user','foods')

    可以找到whereHas的文档以及实现此目的的其他方法

    可以找到有关您使用
    with
    方法所做工作的文档


    希望这能有所帮助。

    您正在使用的
    with
    方法不会以您认为的方式进行过滤。您的代码实际上过滤了食物结果,告诉Elounting检索所有
    商店
    ,或者不检索食物,或者检索名为
    鱼椒
    的食物。这称为约束急切负载

    您正在寻找的方法是
    whereHas
    ,而不是
    with
    。这称为查询关系是否存在

    $shops = Shop::where('city', '=', $location)
        ->with('comments.user')
        ->whereHas('foods', function($query) use($food){
            $query->where('name','=', 'fish pepper'); 
        })
        ->get();
    
    现在,这将只返回具有名称为“鱼椒”的相应食品条目的
    商店

    如果内存可用,
    whereHas
    实际上不会为您填充
    食物
    ,但在这种情况下,您不需要它,因为可以安全地假设它们都有
    鱼椒
    。如果您确实想提取所有食物,请将
    with('comments.user')
    更改为
    with(['comments.user','foods')

    可以找到whereHas的文档以及实现此目的的其他方法

    可以找到有关您使用
    with
    方法所做工作的文档

    希望有帮助