我有表'categories',其中包含字段:id,parent_id,名称,顺序。 Parent_id是其他类别的ID的外键。现在我的控制器从ajax请求接收数组:
public function saveCategories(Request $request) {
if(!$request->ajax()) return Response::json(['error' => 'Received data has invalid format'], 500);
$data = $request->all()['data'];
return $data;
}
收到的数组与表具有相同的字段,因此: id,parent_id,名称和顺序。
用给定数组更新表“类别”的最方便方法是什么?必须记住的是:
与数组中具有相同ID的元素将被更新。
将添加新元素,以便在数据库中尚未找到“ id”的元素。
在数据库中找不到但出现的元素必须删除。
我是否必须遍历所有元素并手动修改数据库?
E:其他一些表涉及类别,因此不能选择删除每一行并从头开始创建所有记录的方法。
E2:受@EduardoJunior答案的启发,我已经做到了以下几点:
public function saveCategories(Request $request) {
if(!$request->ajax()) return Response::json(['error' => 'Sent data invalid format'], 500);
$data = $request->all()['data'];
$all_ids = array_map(function($category){
Category::updateOrCreate(['id' => $category['id']], ['name' => $category['name'],
'parent_id' => $category['parent_id'], 'order' => $category['order']]);
return $category['id'];
}, $data);
Category::whereNotIn('id', $all_ids)->delete();
return ['success' => true];
}
它创建和修改行,但仅更改/添加名称字段。 Parent_id保持不变或在新行中默认为null,与order字段相同。 如果我删除了一个类别,则将触发Category :: whereNotIn(),则服务器将引发错误500。
E3:当然,$ fillable是个问题,我觉得很愚蠢。现在也可以删除。但是,updateOrCreate()中的'parent_id'=> $ category ['parent_id']仍然无法正常工作。名称和顺序并正确保存,但此字段不正确。
答案 0 :(得分:0)
您可以这样做:
<form id='main' action='https://httpbin.org/post' method='post' target='response' onchange='out.value = rad.value; inv.value = out.value; return false'>
<fieldset id='ui'>
<legend>Submitting a Form</legend>
<fieldset>
<input id='xA' name='rad' type='radio' value='A'> A
<input id='xB' name='rad' type='radio' value='B'> B
<input id='xC' name='rad' type='radio' value='C'> C
<input id='xD' name='rad' type='radio' value='D'> D
<output id='out' name='out' for='xA xB xC xD inv'></output>
<input id='inv' name='inv' type='hidden'>
</fieldset>
<button><button></button>
<input type='submit'>
</fieldset>
</form>
<iframe name='response'></iframe>
答案 1 :(得分:0)
另一种方法
/// delete not in list
Category::whereNotIn($data->pluck('id'))->delete();
/// add or update array
foreach($data as $row){
Category::updateOrCreate(
[$row['id']], /// id of model
[$row] /// model array
);
}
答案 2 :(得分:0)
由于@Eduardo Junior,我得以解决问题:
field2
注意:在创建所有新类别以避免任何冲突之后,将使用Eloquent关联方法进行parent_id更新。