Подтвердить что ты не робот

Модельные отношения в Laravel 5.3

У меня есть таблицы MySQL для корзины сайта:

Cart:
id | user 

Cart_goods:
cart_id | good_id | good_type

Details:
id | name

Appliances:

id | name

Корзина класса, содержащая товары:

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');
 }
}

Класс Хороший, который может быть детализирован или приспособлен и по отношению к телеге через 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();
 }
}

Детальный класс:

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');
 }
}

И мне нужно получить всю технику и детали в корзине. Как я могу это сделать, используя ORM?

4b9b3361

Ответ 1

Я сделал это, проблема была в имени модели, я писал ее в DB как Detail и Appliance, но мне нужно было использовать

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

В классе AppServiceProvider.

Ответ 2

Используйте вложенную загрузку с нетерпением. Предполагая, что имена метода отношений cartGoods, details и appliances, что details являются деталями корзины и что вы правильно определили отношения:

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

Ответ 3

Попробуйте следующее:

Метод 1: Если у вас есть экземпляр модели $cart

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

Способ 2: Если вам нужны все приборы и детали из корзины по идентификатору карты

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