laravel插入或更新相关记录

时间:2016-01-22 10:21:51

标签: php laravel

我在更新和创建相关记录时遇到问题,具体取决于它们是否存在。如果成分存在,我想更新成分,如果没有将成分插入数据库并将其与当前的膳食联系起来。

public function update($id)
{
    $meal = Meal::find($id);
    $meal->name = Input::get('name');

    // create ingredients
    $ingredients = Input::get('ingredient');
    $meal_ingredients = array();

    foreach($ingredients as $ingredient)
    { 
        $meal_ingredients[] = new Ingredient(array(
            'name' => $ingredient['name'],
            'unit' => $ingredient['unit'],
            'quantity' => $ingredient['quantity']
        ));
    }

    //save  into the DB
    $meal->save();
    $meal->ingredients()->saveMany($meal_ingredients);

    // redirect
    Flash::success('Votre repas a bien été mis à jour!');
    return Redirect::to('/meals');
}

2 个答案:

答案 0 :(得分:0)

第1步:获取膳食

 $meal = Meal::find($id);

第2步:获取膳食成分(为此创建关系)

 $ingredients = $meal->ingredients;

步骤3:将输入与当前比较并且添加不存在

$new_ingredients = array();

foreach($ingredients as $ingredient)
{ 
    if(!in_array($ingredient->toArray(), Input::get('ingredient')) {
      $new_ingredients[] = new Ingredient(array(
        'name' => $ingredient['name'],
        'unit' => $ingredient['unit'],
        'quantity' => $ingredient['quantity']
      ));
    }
}

第4步更新

$meal->ingredients->saveMany($new_ingredients);

确保您正确地了解膳食和配料之间的关系

答案 1 :(得分:0)

您可以使用firstOrNew()方法。您传递一个数据数组,它将返回与该数据匹配的第一个记录,或者如果没有找到记录,则已经设置了已搜索字段的类的新实例。

foreach($ingredients as $ingredient)
{ 
    $meal_ingredients[] = Ingredient::firstOrNew(array(
            'name' => $ingredient['name'],
        ))->fill(array(
            'unit' => $ingredient['unit'],
            'quantity' => $ingredient['quantity']
        ));
}