Вложенные отношения многие ко многим в Laravel - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть структуры таблиц как

продукты id

пачек id

pack_products pack_id, product_id

pack_optional_products pack_id, product_id

Таким образом, в приведенной выше таблице pack будет иметь 2 типа products, compulsory products и optional products. Это означает, что если покупатель приобретет pack, продукты, которые прилагаются в этом пакете как обязательные, будут автоматически заказаны. , но покупатель также может увидеть, есть ли в упаковке какой-либо дополнительный продукт, поэтому покупатель также может его купить.

Теперь для управления заказами у меня есть следующая таблица.

заказов id, customer_id

order_pack order_id, pack_id

Здесь все отлично работает, используя метод attach как $order->packs()->attach($pack["pack_id"]);

Итак, здесь начинается проблема (когда я пытался добавить дополнительные заказанные продукты в заказанный пакет), чтобы управлять заказом дополнительных продуктов, я создал следующую таблицу

order_pack_product order_id, pack_id, pack_optional_product_id

Я создал модель как.

class Order extends Model
{
    //
    public function packs(){
        return $this->belongsToMany(Pack::class)->withTimestamps()->withPivot('name');
    }

    public function parent() {
        return $this->belongsTo(ParentCustomer::class);
    }
}

class OrderPack extends Model
{
    //
    public function optionalProducts()
    {
        return $this->belongsToMany(PackOptionalProduct::class, 'order_pack_product')->withTimestamps();
    }
}

А потом я вызываю метод как.

$order->packs()->optionalProducts()->attach($optionalProduct["pack_optional_product_id"]);

и я получаю эту ошибку.

BadMethodCallException: вызов неопределенного метода Осветить \ Database \ Красноречивых \ Отношения \ BelongsToMany :: optionalProducts () в файле /.../....../laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php по линии 50

ТАК полный код, относящийся к приведенным выше таблицам, будет таким.

$order = new Order();
$order->parent_id = $parent->id;
$order->school_id = $schoolId;
if($order->save()){
    foreach($json["packs"] as $pack){
        $order->packs()->attach($pack["pack_id"], ["child_name" => $pack["child_name"]]);
        foreach($pack["optional_products"] as $optionalProduct){
            $order->packs()->optionalProducts()->attach($optionalProduct["pack_optional_product_id"]);
        }
    }
    return response()->json(["status" => "ok", "order_id" => $order->id]);
}else{
return response()->json(["status" => "failed"]);
}

1 Ответ

0 голосов
/ 17 ноября 2018

optionalProducts() - метод модели, а не отношения packs().

Метод $order->packs() - возвращает объект отношения, атрибут $order->packs - возвращает коллекцию моделей пакетов.

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

foreach($pack["optional_products"] as $optionalProduct){
  foreach($order->packs as $item){
     $item->optionalProducts()->attach($optionalProduct["pack_optional_product_id"])
  }
}

Возможно, этот код не исправит ошибку, тогда вам нужно исправить логику кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...