У меня есть структура таблицы следующим образом:
- таблица компаний (hasMany отгрузки, hasMany Packages)
- таблица заказов (принадлежит компании, имеет много отправлений, имеет много пакетов)
- таблица отгрузок (принадлежит компании, принадлежит заказу, имеет много пакетов)
- упаковка пакетов (принадлежит отгрузке и принадлежит компании)
При создании записи пакета я хотел бы сделать что-то вроде:
$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 в таблицу пакетов». Однако, возможно, лучше просто посмотреть, какие грузы принадлежат компании, и отработать пакеты оттуда.