Laravel-更新数据库以适合数组

时间:2019-03-18 22:50:42

标签: php ajax database laravel

我有表'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,名称和顺序。

用给定数组更新表“类别”的最方便方法是什么?必须记住的是:

  1. 与数组中具有相同ID的元素将被更新。

  2. 将添加新元素,以便在数据库中尚未找到“ id”的元素。

  3. 在数据库中找不到但出现的元素必须删除。

我是否必须遍历所有元素并手动修改数据库?

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']仍然无法正常工作。名称和顺序并正确保存,但此字段不正确。

3 个答案:

答案 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>&lt;button&gt;</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更新。