Home > OS >  How to correctly handle relationships between models in blade templates?
How to correctly handle relationships between models in blade templates?

Time:11-14

I'm trying to create shopping cart page. From controller I'm getting an array of order items. Order item has foreign key "meal_id" - relationship with table meals. I need to access to connected meal object, to display information. How should I do it correctly? I tried to include php key inside blade template:

        @foreach($order_items as $order_item)
                ...
                @php
                    $meal = \App\Models\Meal::where('id', '=', $order_item->meal_id)->get();
                @endphp
                ...
        @endforeach

But it doesn't work. Of course I can send two different arrays of order_items and meals and hope, that sequence will be equal... Or I can somehow send one array with joint tables. But isn't there more simple way to do this?

CodePudding user response:

You need to define a relationship between the models so you'll have access to it via the Eloquent ORM and you will be able to do something like that in your blade template for example:

$order_item->meals;

You can read more about Laravel relationships and how to set each type of relationship here

CodePudding user response:

you can't intract with database inside view files , this is neither clean code , nor usefull, and it is cause a problem called N 1 problem , the solution is to create a relationship inside the model class, you can find more about relationships at laravel.com, anyway here is an examlpe : first thing create a method inside the Order model named meals , then you need to select which relation you should use , in your case the relation is has many , since Meal has many order items , so inside the meal method use like this: return $this->belongsTo(Order::class). for more examples I realy recommend you to see Eloquent Relationships on laravel.com they have a great docs to simplify these things, after creating the relationship and before passing the $order_items to the view, you should load the relation , somthing like this : Order::with('meal')->get() or if you already have an instanse you can use $orders->load('meal'), ther is several ways how to call a relationship , but however you do it , try to do it outside the view section or any loops insid blade

  • Related