插入模型,除非它存在并附加它

时间:2016-07-25 14:46:25

标签: php laravel eloquent laravel-5.2

我是Laravel noob将一些旧代码改写为Laravel。

我有一个用于管理购买游戏的系统,我正在编写PurchaseController的store方法。创建新购买的表单包含有关购买的数据和包含游戏数据的数组。

游戏和购买之间存在多对多的关系:购买可以包含许多游戏,游戏可能会与多次购买相关联。

事情是游戏可能已经存在于数据库中。我想做以下事情:

  1. 将新购买插入数据库(这部分我已经整理好了;))
  2. 检查游戏的POSTed名称是否已存在于数据库中。
  3. 如果存在,请将其附加到新插入的购买中。如果它不存在,请将其插入并将其附加到新插入的购买中。
  4. 如果游戏已经存在于数据库中,我不想更新游戏,只是将其附加到购买中。

    我已查看firstOrCreate,但这并不是我想要的。它会检查您提供的所有参数,而不能只检查名称(基本上是this issue)。

    The undocumented method updateOrCreate确实接受两个数组(一个用于检查属性,另一个用于插入值)但是如果存在则更新记录,这不是我想要的。

    那么,有没有一个很好的,正确的方法来使用Eloquent或者我只需要手动编写一些代码来检查游戏是否存在于数据库中并插入游戏,除非是这样的情况? / p>

    编辑:

    毕竟在Laravel 5.3中firstOrCreate似乎可以实现这一点:https://github.com/laravel/framework/pull/13236

2 个答案:

答案 0 :(得分:0)

firstOrCreate是您所需要的,但您可以只提供游戏名称,然后将其附加到您的购买中。

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

答案 1 :(得分: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);
}

我想也许有更好/更短的方法来做到这一点。