我在更新和创建相关记录时遇到问题,具体取决于它们是否存在。如果成分存在,我想更新成分,如果没有将成分插入数据库并将其与当前的膳食联系起来。
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');
}
答案 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']
));
}