多行Eloquent查询



我正试图根据所选的过滤器以及可能的搜索词/单词来过滤我的产品。我的过滤器与类别有关系,而类别又与我的产品有关系。下面的代码只有在所有内容都链接在一起时才有效(没有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);

我认为可以,但在添加关系之前,不需要先查询所有带标题的产品。但是这里的错误是,在将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的回答让我进行了更多的调试,并最终解决了我的问题,尽管这不是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);

最新更新