3

I have been working on a personal project where users can rate different shops. Among many, I have two tables schemas that I am working on.

Table: Shops

  1. id
  2. shop_name
  3. user_id (shops belongs to a user)

Table : Ratings

  1. id
  2. shop_id (foreign_key)
  3. rating
  4. user_id

Now I want to fetch all the shops and its corresponding ratings using SQL join.

 $shop = Shop::leftJoin('ratings', 'ratings.shop_id', '=', 'shops.id')
    ->select('shops.*', 'ratings.rating')->get();
    return response($shop);

When I do this I get response but the it is repeated for each ratings on the same shop.

[
    {
        "id": 1,
        "name": "manjil",
        "rating": 4
    },
    {
        "id": 1,
        "name": "manjil",
        "rating": 5
    },
    {
        "id": 1,
        "name": "manjil",
        "rating": 2
    }]

What I really want is :

        [{
            "id": 1,
            "name": "manjil",
            "rating": [4,5,2]
        }]

Please Laravel geeks, help :)

1
  • try ->groupBy('rating'); before ->get(); Commented Jul 28, 2020 at 15:01

1 Answer 1

5

the easy solution would be to use the relation directly

$shops = Shop::with('ratings')->get();
//possible mapping here
return response($shops);

you can afterwards map the ratings to get only an array of the field rating

$shops = $shops->map(function ($shop) {
    $shop->ratings = $shop->ratings->pluck('rating')->all();
    return $shop;
});
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.