Стремится загрузить одно отношение многие ко многим
У меня есть две модели, соединенные через сводную таблицу с дополнительным столбцом для отслеживания количества
class Item extends Eloquent {
public function containers()
{
return $this->belongsToMany('Container', 'items_containers', 'item_id', 'container_id')->withPivot(['quantity']);
}
}
class Container extends Eloquent {
public function items() {
return $this->belongsToMany('Item', 'items_containers', 'container_id', 'item_id')->withPivot(['quantity']);
}
}
И третья модель для моих заказов:
class OrderItem extends Eloquent {
public function originalItem()
{
return $this->hasOne('Item', 'id', 'item_id');
}
public function container() {
return $this->hasOne('Container', 'id', 'container_id');
}
}
Я хочу получить конкретные данные из сводной таблицы при загрузке моделей OrderItem, поэтому я получаю только то количество, при котором item_id
а также container_id
соответствует тому, что на элементе заказа.
OrderItems::whereOrderId($orderId)
->with(['originalItem', 'container', '???'])
->get();
Каков наилучший способ указать отношение в OrderItem или загрузить его с with
?
2 ответа
Следующее возвращает то, что вы хотите:
$orders = \App\OrderItem::select('item_orders.*', 'items_containers.quantity as quantity')->with('item', 'container')
->leftJoin('items_containers', function ($join) {
$join->on('items_containers.item_id', 'item_orders.item_id')
->where('items_containers.container_id', \DB::raw('item_orders.container_id'));
})
->get();
Тогда вы можете легко получить количество.
$orders->first()->quantity;
Вот и все.
Майор подпирает Мортезу Раджаби за то, что он вывел меня на правильный путь. Первым ключом было получение определенного отношения, поскольку, хотя "Предметы и контейнеры" являются отношением "многие ко многим", "OrderItem" имеет отношение "один к одному" как с "Предметом", так и с "Контейнером". Чтобы получить определенное количество отношений, мне нужно было создать атрибут, определяющий его:
public function getItemContainerQtyAttribute() {
if($this->item_id && $this->container_id) {
return $this->depoItem->containers()->where('items_containers.container_id', $this->container_id)->first()->pivot->quantity;
}
return null;
}
Проверка item_id и container_id связана с тем, что эта работа еще не завершена, и элементы OrderItems не всегда создавались правильно, а для некоторых элементов контейнер не указан.
Следующим шагом было его автозагрузка с appends
атрибут в Eloquent:
protected $appends = ['item_container_qty'];
Теперь всякий раз, когда я загружаю $item = OrderItems::whereOrderId($order_id)->get();
, он автоматически загрузит количество осей.