注文を作成するときに入力する必要のあるテーブルが3つありますが、これを行うための最良の方法を知りたいです。
テーブル
Orders
- id (pk)
- company_id
- address_id (join to items table)
- date
- source
- ...
Addresses
- id (pk)
- company_id
- name
- email
- address
- ...
Items
- id (pk)
- order_id (join to orders table)
- product_id
- qty
- ...
関係
創造
私の理解では、IDを取得するには、最初にアドレスを作成する必要があります。次に、注文が作成され、続いてアイテムが作成されます。
また、挿入が失敗した場合に、(SQLトランザクションのように)データが保存されないようにしたいと思います。
誰かがこれを行うための最良の方法のために私を正しい方向に向けることができるのだろうか?これまでのところ私は以下を持っています
$address = OrderAddress::create([
'company_id' => Auth::user()->company_id,
'name' => 'test test',
'email' => '[email protected]',
'address' => '78 test street',
]);
$order = $address->order()->create([
//'address_id' => populated by model
'company_id' => Auth::user()->company_id,
'date' => '2018-03-23',
'source' => 'mystore'
]);
foreach($items as $item){
OrderItem::create([
'order_id' => $order->order_id,
'product_id' => $item->product_id,
'qty' => $item->qty
]);
}
私の主な問題は次のとおりです。
基本的に2つの改善点があります。問題ごとに1つ。
トランザクションですべてをラップするために、create
ステートメントをDB::transaction(...)
ブロックに入れることができます。参考までに、マニュアルをご覧ください。そこに記載されているトランザクションを使用する別の方法もあります。
をcreate
作成するときに使用したのと同じ関係方法を:にOrder
適用することもできます。OrderItems
$order->items()->create([...])
最終的なコードスニペットは次のようになります。
DB::transaction(function () {
$address = OrderAddress::create([
'company_id' => Auth::user()->company_id,
'name' => 'test test',
'email' => '[email protected]',
'address' => '78 test street',
]);
$order = $address->order()->create([
'company_id' => Auth::user()->company_id, // actually, this information is already available through the `address`
'date' => '2018-03-23',
'source' => 'mystore'
]);
foreach($items as $item){
$order->items()->create([
'order_id' => $order->order_id,
'product_id' => $item->product_id,
'qty' => $item->qty
]);
}
});
のorderItems()
代わりに呼び出される場合は、必ずリレーションシップ名を変更してくださいitems()
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加