Sunday, February 19, 2017

Model relationships in Laravel 5.3

Leave a Comment

I've got MySQL tables for site cart:

Cart: id | user   Cart_goods: cart_id | good_id | good_type  Details: id | name  Appliances:  id | name 

Class Cart, which contains goods:

class Cart extends Model {  protected $table = 'cart';  protected $fillable = ['user', 'sum', 'profit', 'discount'];  protected $guarded = ['user'];   public function goods()  {     return $this->hasMany('App\Models\Good');  } } 

Class Good, which can be Detail or Appliance and relative to cart by cart_id:

class Good extends Model {  protected $table = 'cart_goods';  protected $types = [     'Detail' => 'App\Models\Detail',     'Appliance' => 'App\Models\Appliance'  ];  public $primaryKey = 'cart_id';   public function good()  {     return $this->morphTo();  } } 

Detail class:

class Detail extends Model {  use SoftDeletes;   protected $morphClass = 'Detail';  protected $table = 'details';  protected $fillable = ['article', 'name', 'photo', 'price_procurement', 'price_retail', 'serial', 'location_id', 'type_id', 'appliance_id', 'comment', 'for'];  protected $dates = ['deleted_at'];  protected $guarded = [];   public function goods()  {     return $this->morphMany('App\Models\Good', 'good');  } } 

And i need to get all appliances and details in cart. How can i do it by using ORM?

3 Answers

Answers 1

Use nested eager loading. Assuming that relationship method names are cartGoods, details and appliances, that details are details of a cart and that you've defined the relationships right:

Card::where('id', $id)     ->with('cartGoods.appliances', 'details')     ->first(); 

Answers 2

Try this:

Method 1: If you have a $cart model instance

$cart->load('goods.good'); 

Method 2: If you need all appliances and details from cart by card ID

Cart::where('id', $cartId)->with('goods.good')->first(); 

Answers 3

I've done this, problem was in model name, i was writing it to DB like Detail and Appliance, but i was need to use

Relation::morphMap([    'detail' => 'App\Models\Detail',    'appliance' => 'App\Models\Appliance', ]); 

In AppServiceProvider class.

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment