2016-07-25 14 views
0

私はLaravelにいくつかの古いコードを書き直しています。モデルが存在しない場合は、モデルを挿入して添付してください。

は私が購入ゲームと私はPurchaseControllerのstore方法を書いてを管理するためのシステムを持っています。新規購入を作成するためのフォームには、購入に関するデータと、ゲームに関するデータを含む配列が含まれています。

ゲームと購入の間に多対多の関係があります。購入には多くのゲームが含まれ、ゲームは複数の購入にリンクされることがあります。

ゲームはデータベースに既に存在している可能性があります。私は、次の操作を実行したい:

  1. データベース(この部分は私がすでに整理しまった;)に新規購入を挿入し、ゲームのPOSTさ名前が既にデータベースに存在する場合)
  2. チェック。
  3. 存在する場合は、新しく挿入した購入に添付します。存在しない場合は、それを挿入し、新しく挿入した購入に添付します。

ゲームがデータベースに既に存在していて、購入にアタッチするだけでは、ゲームを更新したくないです。

私はfirstOrCreateを調べましたが、それは私がしたいことをしません。それはあなたがそれを供給するすべての引数をチェックするだけで、それは名前(基本的にthis issue)だけをチェックすることはできません。

The undocumented method updateOrCreateは、2つの配列(チェックする属性と挿入する値)を受け入れますが、レコードが存在する場合はそれを更新しますが、これは必要なものではありません。

Eloquentでこれを行うには、いいやり方がありますか?そうでない限り、ゲームがデータベースに存在するかどうかをチェックするコードを手動で書く必要がありますか?

EDIT:

これはLaravel 5.3のすべての後firstOrCreateで可能であると思われる:https://github.com/laravel/framework/pull/13236

+1

どのように世界の誰かがデータベースにないゲームを購入するのですか? – Borjante

+0

私が不明な場合は申し訳ありません。これはウェブショップではなく、ゲームライブラリを管理するためのシステムです。ゲームがデータベースにない場合、それは挿入すべき新しいゲームです。 – Compizfox

+0

Eloquentをすべて使用する必要はありません。 'DB :: raw(" INSERT IGNORE INTO ... "は依然として利用可能であり、データベースにその仕事をさせています)。 –

答えて

0

これはあまりにも多すぎます。次のコードは、私が望むことをしています:

// Insert games (unless they exist) and attach to new purchase 
foreach($request->games as $game) { 
    $gameModel = Game::firstOrNew(['name' => $game['name']]); 
    if(!$gameModel->exists) { 
     $gameModel->status_id = $game['status']; 
     $gameModel->note = $game['note']; 
     $gameModel->save(); 
    } 
    $gameModel->purchases()->attach($purchase->id); 
} 

私はおそらくこれを行うより良い方法があったと思いました。

+1

あなたは '$ purchase-> id'を使う必要はありません。' $ purchase'だけ使うことができます – Styphon

0

firstOrCreateは何が必要ですが、あなたはあなたにそれを添付し、その後、それをただのゲーム名を供給することができます購入。

$game = Game::firstOrCreate(['name' => $gameName]); 
$purchase = new Purchase(['otherArgs' => ...]); 
$purchase->games()->attach($game); 
+0

あなたの答えをありがとう。 *ゲーム*に*名前*だけのプロパティが追加されているため、これは機能しません。だから私はそれらの他のプロパティを設定し、それを 'save()'する必要がありますが、それは* game *があればそれが私の望んでいないものを更新するでしょう。 さらに、外的なキー制約のために名前だけでゲームを挿入することさえできません。 – Compizfox

関連する問題