Skip to content
Advertisement

Multiline Eloquent query

I’m trying to filter my products based on selected filters and possibly a search term/word. My filters have a relationship with categories, which in their turn have a relation ship with my products. My code below only works (without the if statement checking for a search term/word) when everything is chained together, but when I try to break the query into multiple lines (which I’ve read is possible, right?) it returns an empty array.

Here’s a my code:

// 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);

Advertisement

Answer

Lukas’ answer led me to do some more debugging and eventually solving my problem, though it was not the position of the if statement checking if there’s a search term/word.

The problem lies in the following line:

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

I needed to store the retrieved results from the get(); method in another variable, in my case:

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

I eventually ended up with the following working code:

// 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);
User contributions licensed under: CC BY-SA
3 People found this is helpful
Advertisement