【问题标题】:Laravel 5- Foreach loop saves just last record?Laravel 5- Foreach 循环只保存最后一条记录?
【发布时间】:2017-11-25 14:22:54
【问题描述】:

我想保存我的数组数据,但是当我尝试使用 foreach 循环时,它只保存最后的记录。

这是表单刀片(没有不必要的 html 代码);

@foreach($categories as $key=>$category)

  <input type="hidden"  name="menusettings[{{$key}}][menu_name]" value="{{$category->category_name}}">
  <input type="hidden"  name="menusettings[{{$key}}][menu_slug]" value="category/{{$category->category_slug}}" >
  <input type="checkbox" checked name="menusettings[{{$key}}][menu_status]">
  <input type="number" value="$i" name="menusettings[{{$key}}][menu_order]" >

@endforeach

和控制器; 公共函数 postUpdateMenu(请求 $requests){

        $menu = new Menu;

                $request = $requests->get('menusettings');

                foreach ($request as $reques) {

                    $menu_status = isset($reques['menu_status']) ? 1 : 0;

                    $menu->menu_name = $reques['menu_name'];
                    $menu->menu_slug = $reques['menu_slug'];
                    $menu->menu_status = $menu_status;
                    $menu->menu_order = $reques['menu_order'];

                    $menu->save();
                }

    return back();


}

有什么建议吗?

【问题讨论】:

  • $menu = new Menu; 放入循环中
  • 那是因为你把 $menu = new Menu 放在你的循环之外,这样,laravel 创建一个菜单项,然后在每个循环中更新它
  • @Zoran 和 am05mhz 非常感谢你

标签: php laravel-5 laravel-5.5


【解决方案1】:

首先。不推荐你写的代码。

如果你想走自己的路: 尝试用以下代码替换您的代码:

            $request = $requests->get('menusettings');

            foreach ($request as $reques) {
                // every time the loop executes a new instance needs to be assigned.
                $menu = new Menu;
                $menu_status = isset($reques['menu_status']) ? 1 : 0;

                $menu->menu_name = $reques['menu_name'];
                $menu->menu_slug = $reques['menu_slug'];
                $menu->menu_status = $menu_status;
                $menu->menu_order = $reques['menu_order'];

                $menu->save();
            }

            return back();

完全不推荐使用上述方法,因为每次循环执行时都会与数据库建立连接。 现在让我们考虑另一个选项(推荐,因为这个更好。) 您还需要在 Menu 模型中声明以下数组

protected $fillable = [ 'menu_name','menu_slug', 'menu_status','menu_order','created_at' , 'updated_at'];

控制器代码:

        $request = $requests->get('menusettings');
        $now = date('Y-m-d H:i:s'); //alternatively you may also use Carbon::now
        $menu = [];

        foreach ($request as $reques) {
            $menu_status = isset($reques['menu_status']) ? 1 : 0;

            $menu[] = [ 'menu_name' => $reques['menu_name'] , 'menu_slug' => $reques['menu_slug'] , 'menu_status' => $menu_status , 'menu_order' => $reques['menu_order'] , 'created_at' => $now , 'updated_at' => $now];
        }
        Menu::insert($menu);
        return back();

【讨论】:

  • 谢谢,但@am05mhz 已经说过了。但我还是不知道,为什么要在循环中定义模型?
  • 每次循环连接数据库有什么问题? @ore​​opot
  • 在多次连接到数据库时会使用额外的资源,因此效率会降低,而这可以以更有效的方式实现。
猜你喜欢
  • 2022-01-17
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 2012-06-01
  • 1970-01-01
  • 2018-02-05
  • 2020-12-01
相关资源
最近更新 更多