Модельные отношения в 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?
Ответы
Ответ 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();