Отношения Laravel - получение идентификаторов из нескольких моделей - PullRequest
0 голосов
/ 10 мая 2018

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

  1. таблица компаний (hasMany отгрузки, hasMany Packages)
  2. таблица заказов (принадлежит компании, имеет много отправлений, имеет много пакетов)
  3. таблица отгрузок (принадлежит компании, принадлежит заказу, имеет много пакетов)
  4. упаковка пакетов (принадлежит отгрузке и принадлежит компании)

При создании записи пакета я хотел бы сделать что-то вроде:

$shipment = $order->shipments()->create($request->all());
$package = $shipment->packages()->create();

Если я брошу кубик на $ shipment, там будут все правильные идентификаторы, и я ожидал бы, что отношения позволят это создать. Однако создание пакетов завершается неудачно, если не указано значение для order_id (идентификатор в таблице заказов)

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

EDIT:

Заказы

Schema::create('orders', function (Blueprint $table) {
    $table->uuid('id');
    $table->uuid('company_id');
    $table->uuid('order_address_id');
    $table->integer('user_id');
    $table->string('unique_id');
    $table->string('order_ref')->default('');
    $table->string('status');
    $table->boolean('hold_or_cancel')->default(0);
    $table->string('shipping_method');
    $table->dateTime('completed_at')->nullable();
    $table->timestamps();
    $table->unique(array('company_id', 'unique_id'));

Отправления

Schema::create('shipments', function (Blueprint $table) {
    $table->uuid('id');
    $table->uuid('order_id');
    $table->uuid('company_id');
    $table->string('status')->default('new');
    $table->string('shipment_type');
    $table->string('shipping_method')->default('');
    $table->string('reference')->default('');
    $table->timestamps();
});

пакет

Schema::create('shipment_packages', function (Blueprint $table) {
    $table->uuid('id');
    $table->uuid('order_id');
    $table->uuid('company_id');
    $table->uuid('shipment_id');
    $table->string('tracking_number')->default('');
    $table->integer('package_weight_g')->nullable();
    $table->integer('package_length_cm')->nullable();
    $table->integer('package_width_cm')->nullable();
    $table->integer('package_height_cm')->nullable();
    $table->timestamps();
});

Для создания заказа я использую следующее, которое отлично работает.

$address = OrderAddress::create($data);
$order = $address->order()->create($data);

Для создания отгрузки и упаковки, которую я пытаюсь использовать:

DB::transaction(function () use ($order, $request) {
    $shipment = $order->shipments()->create($request->all());
    $package = $shipment->shipmentPackages()->create();
});

Однако я не могу просмотреть этот идентификатор компании или заказа, используя этот метод, что я хотел бы сделать, чтобы легко увидеть списки отправлений и пакетов, которые принадлежат заказам или компаниям, т.е. отправка принадлежит заказу И Компания. Для посылки это относится к отгрузке, заказу и компании.

Подумав, может быть, я пытаюсь связать каждую таблицу со слишком многими вещами. Я рассуждал об этом так: «Что если я захочу узнать все пакеты, которые отправила компания, поэтому я должен включить company_id в таблицу пакетов». Однако, возможно, лучше просто посмотреть, какие грузы принадлежат компании, и отработать пакеты оттуда.

1 Ответ

0 голосов
/ 10 мая 2018

Похоже, что ваши отношения неправильные, order_id должен быть в таблице отгрузок, поэтому он связан с id в заказе.

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