Стремится загрузить одно отношение многие ко многим

У меня есть две модели, соединенные через сводную таблицу с дополнительным столбцом для отслеживания количества

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();, он автоматически загрузит количество осей.

Другие вопросы по тегам