【问题标题】:How to update pivot table records using Eloquent in Laravel如何在 Laravel 中使用 Eloquent 更新数据透视表记录
【发布时间】:2019-12-13 12:31:38
【问题描述】:

这里是模型和控制器的源代码。

我的角色.php

class Role extends Model
{
    public function permissions()
    {
        return $this->belongsToMany('App\Models\Permission');
    }
}

我的权限.php

 class Permission extends Model
    {
        public function roles()
        {
            return $this->belongsToMany('App\Models\Role');
        }
    }

我的控制器

class RoleController extends Controller
{

    public function update(Request $request, $id) {
          $role = Role::findOrfail($id);
          $roleid = $role->id;
          $permissions = $request->permissions;
          foreach ($role as $roles) {
                 $roles->permissions()->updateExistingPivot($roleid, $permissions);
          }
    }
}

感谢您的帮助。谢谢

【问题讨论】:

  • 为什么要迭代单个角色模型?你只有一个角色有什么要迭代的?

标签: laravel pivot-table


【解决方案1】:

假设您要“同步”角色的权限,请让该角色仅具有通过请求输入传递​​的权限:

public function update(Request $request, $id) 
{
    // validate the permissions array
    ...

    $role = Role::findOrFail($id);

    $role->permissions()->sync($request->input('permissions', []));

    ...
}

Laravel 6.x Docs - Eloquent - Relationships - Updating Many to Many Relationship - Syncing Associationssync

【讨论】:

    【解决方案2】:

    你可以使用 laravel 内置函数

    添加 = attach

    删除 = detach

    更新 = sync

    更多信息 https://laravel.com/docs/5.8/eloquent-relationships#updating-many-to-many-relationships

    【讨论】:

      【解决方案3】:

      在更新数据时传递数组数据

      class RoleController extends Controller
      {
              public function update(Request $request, $id) {
                $input = $request->all();
                $role = Role::findOrfail($id);
                $roleid = $role->id;
                $permissions = $input['permissions'];
                foreach ($role as $roles) {
                       $roles->permissions()->updateExistingPivot($roleid, $permissions);
                }
          }
      }
      

      【讨论】:

      • 得到这个错误 在布尔值上调用成员函数权限()
      【解决方案4】:

      用资源创建一个控制器并将控制器分配给web.php

      你的表单的动作应该如下并使用

          action="{{route('GustPosts.update', $DataEdit->id)}}"
          @csrf
          @method('put')
      

      如下形式

       <form action="{{route('GustPosts.update', $DataEdit->id)}}" method="post">
                  @csrf
                  @method('put')
      </form>
      

      在你的控制器上

      编辑函数

      public function edit($id)
          {
              $data = Post::find($id);
              return view ('gustUpdateForm',['DataEdit'=> $data]);
           }
      

      更新功能

      public function update(Request $request, $id)
          {
      
                  $objProductsUpdate = Post::find($id);
                  $objProductsUpdate -> ProductName = $request -> get('PNameTxt');
                  $objProductsUpdate -> ProductModel = $request -> get('PModelTxt');
                  $objProductsUpdate -> ProductPrice = $request -> get('PPriceTxt');
                  $objProductsUpdate -> OriginalFileName = $file->getClientOriginalName();
                  $objProductsUpdate -> FileName = $file->getFilename().'.'.$extension;
                  $objProductsUpdate ->save();
      
                  return redirect()->route('products.index'); 
          }
      

      【讨论】:

        猜你喜欢
        • 2016-02-06
        • 2016-02-21
        • 1970-01-01
        • 2019-04-27
        • 2015-12-28
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        相关资源
        最近更新 更多