【问题标题】:Multiline Eloquent query多行 Eloquent 查询
【发布时间】:2020-12-29 16:20:02
【问题描述】:

我正在尝试根据选定的过滤器和可能的搜索词/词来过滤我的产品。我的过滤器与类别有关,而类别又与我的产品有关。我下面的代码仅在所有内容都链接在一起时才有效(没有 if 语句检查搜索词/单词),但是当我尝试将查询分成多行时(我读过这是可能的,对吗?)它返回一个空数组。

这是我的代码:

// Create array from selected categories/filters
$filter_ids = explode(',', $request->get('cats'));

// Query for active products
$products = Product::where('active', '=', 1);
$products->with(['categories' => function($query) use ($filter_ids) {
    // Query for active categories
    $query->where('active', 1)->whereHas('filters', function ($query)  use ($filter_ids) {
        // Query for the selected filters from the request 
        $query->whereIn('id', $filter_ids);
    });
}]);

// Check for search term/word
if ($request->get('q')) {
    $q = $request->get('q') ? urldecode($request->get('q')) : null;
    $products->where('title', 'LIKE', "%{$q}%");
}

// Limit to 10 items and get results
$products->limit(10)->get();

return response()->json([
    'status' => 'success',
    'response' => $products
], 200);

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    我认为您可以不需要在添加关系之前先查询所有带有标题的产品。但是这里有什么问题是您必须先将 get() 的结果存储在一个变量中,然后再将其添加到您的 json 响应正文中:

    尝试做类似的事情:

    if ($request->get('q')) {
    $q = $request->get('q') ? urldecode($request->get('q')) : null;
    $products->where('title', 'LIKE', "%{$q}%");
    }
    
       $products->with(['categories' => function($query) use ($filter_ids) {
        // Query for active categories
        $query->where('active', 1)->whereHas('filters', function ($query)  use ($filter_ids) {
            // Query for the selected filters from the request 
            $query->whereIn('id', $filter_ids);
        });
       }]);
    
    
    $response = $products->limit(10)->get();
    
    return response()->json([
        'status' => 'success',
        'response' => $response
    ], 200);
    

    【讨论】:

    • 嗨 Lukas,感谢您在我自己找到解决方案后的旧答案和编辑:)
    【解决方案2】:

    Lukas 的回答让我进行了更多调试并最终解决了我的问题,尽管这不是 if 语句检查是否有搜索词/单词的位置。

    问题出在下面一行:

    $products->limit(10)->get();

    我需要将 get(); 方法检索到的结果存储在另一个变量中,在我的例子中:

    $response = $products->limit(10)->get();

    我最终得到了以下工作代码:

    // Create array from selected categories/filters
    $filter_ids = explode(',', $request->get('cats'));
    
    // Query for active products
    $products = Product::where('active', '=', 1);
    $products->with(['categories' => function($query) use ($filter_ids) {
        // Query for active categories
        $query->where('active', 1)->whereHas('filters', function ($query)  use ($filter_ids) {
            // Query for the selected filters from the request 
            $query->whereIn('id', $filter_ids);
        });
    }]);
    
    // Check for search term/word
    if ($request->get('q')) {
        $q = $request->get('q') ? urldecode($request->get('q')) : null;
        $products->where('title', 'LIKE', "%{$q}%");
    }
    
    // Limit to 10 items, get results and store in '$response'
    $response = products->limit(10)->get();
    
    return response()->json([
        'status' => 'success',
        'response' => $response
    ], 200);
    

    【讨论】:

      猜你喜欢
      • 2017-07-30
      • 2018-09-24
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2014-10-25
      • 2019-07-21
      • 1970-01-01
      相关资源
      最近更新 更多