Laravel-関係のあるマルチテーブルインサート

アダム・ランバート

注文を作成するときに入力する必要のあるテーブルが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
- ...

関係

  • アドレステーブルは注文テーブルに属します
  • hasManyアイテムを注文する
  • マルチテナント(単一データベース)構造があるため、company_idを使用して企業間でデータを分離します。注文と住所の両方が会社に属します。

創造

私の理解では、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
    ]);
}

私の主な問題は次のとおりです。

  1. これはトランザクションとしては機能しません。つまり、失敗してもロールバックは作成されません。
  2. モデルの関係を最大限に活用しているかどうかはわかりません。
ナモシェク

基本的に2つの改善点があります。問題ごとに1つ。

  1. トランザクションですべてをラップするために、createステートメントをDB::transaction(...)ブロックに入れることができます。参考までに、マニュアルをご覧くださいそこに記載されているトランザクションを使用する別の方法もあります。

  2. 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]

編集
0

コメントを追加

0

関連記事

Laravel関係マルチテーブル

laravel EloquentORMマルチテーブルインサート

Laravel 6:バルクインサート関係のあるバルクインサート

Laravel-マルチテーブルの関係を定義する

Laravelルーメン別のテーブルIDの関係

Laravel結合テーブルの関係

Laravelサブドメインルートマッチングの問題

Laravelの関係、コメントを関連付けるための追加のテーブルが必要ですか?

Laravel-熱心な負荷のあるピボットテーブルを介した1対1の関係

別のテーブルとの関係内のLaravel関係

リンクテーブルとのLaravelの関係-混乱

ピボットテーブルとのLaravelの関係

ピボットテーブルにLaravelテーブルの関係

Laravelのピボットテーブルに列の関係を追加する方法

Laravel4のピボットテーブルとの関係を保存する

Laravel:複数のピボットテーブルの関係を使用する方法

Laravelの雄弁な関係とピボットテーブル

Laravelピボットテーブルのn:m関係

ピボットテーブルの関係Laravel

Laravelは関係のある3つのテーブルを表示し、1つのテーブルが他の2つのテーブルを接続します

配列の最大アイテムマルチセレクトlaravelブレードテンプレート

マルチテナントlaravelアプリケーションでのWilcardサブドメインベースのセッション

関係の異なる名前で使用するLaravelデータテーブルサービス

laravelを使用してテーブル関係の各行IDをカウントする方法は?

Laravel 3テーブルEloquent:関係

Laravel:関係のある3つのテーブルからデータを取得する方法

「スルー」テーブルを使用したlaravelのHasOne関係

LaravelカスケードインサートスルーHasMany関係

Laravel Eloquent:複数の関係を持つピボットを介してテーブルを別のテーブルにバインドします

TOP 一覧

  1. 1

    PictureBoxで画像のブレンドを無効にする

  2. 2

    レスポンシブウェブサイトの一番下にスティッキーなナビゲーションバーを作成するのに問題がある

  3. 3

    Rパッケージ「AppliedPredictiveModeling」のインストール中にエラーが発生しました

  4. 4

    Chromeウェブアプリのウェブビューの高さの問題

  5. 5

    HTTPヘッダー 'SOAPAction'の値はサーバーによって認識されませんでした

  6. 6

    Pythonを使用して、リストからデータを読み取り、特定の値をElasticsearchにインデックス付けするにはどうすればよいですか?

  7. 7

    C ++でのcURLとマルチスレッドの使用

  8. 8

    セレンのモデルダイアログからテキストを抽出するにはどうすればよいですか?

  9. 9

    tkinterウィンドウを閉じてもPythonプログラムが終了しない

  10. 10

    STSでループプロセス「クラスパス通知の送信」のループを停止する方法

  11. 11

    Spring @ModelAttributeモデルフィールドマッピング

  12. 12

    Python / SciPyのピーク検出アルゴリズム

  13. 13

    Ansibleで複数行のシェルスクリプトを実行する方法

  14. 14

    テキストフィールドの値に基づいて UIslider を移動します

  15. 15

    tf.nn_conv2dとtf.nn.depthwise_conv2dの違い

  16. 16

    ZScalerと証明書の問題により、Dockerを使用できません

  17. 17

    MLでのデータ前処理の背後にある直感

  18. 18

    Postmanを使用してファイル付きの(ネストされた)jsonオブジェクトを送信する

  19. 19

    java.lang.NoClassDefFoundError:com / sun / istack / tools / DefaultAuthenticator $ Receiver

  20. 20

    Windows 10 Pro 1709を1803、1809、または1903に更新しますか?

  21. 21

    BLOBストレージからデータを読み取り、Azure関数アプリを使用してデータにアクセスする方法

ホットタグ

アーカイブ