【问题标题】:laravel eloquent : How to update data if existlaravel 雄辩:如果存在,如何更新数据
【发布时间】:2017-03-11 18:09:56
【问题描述】:

我有一张桌子,里面有user_idrole_id。现在,如果我从下拉列表中选择 user_id = 1 并从下拉列表中选择 role_id = 2 并保存它..下次如果我想为同一个用户设置另一个角色而不是在表中创建新行..如何在不创建新行的情况下更新它?任何人都可以提出一些建议吗?

$roleUser = RoleUser::firstOrNew(
            ['role_id' => $request->Input(['role_id']),
             'user_id' =>$request->Input(['user_id'])] );
            $roleUser->save();

我使用了 firstOrNew 方法,但它创建了一个新条目而不是更新旧条目。

【问题讨论】:

  • 所以一个User只能有1个Role??
  • 是的.. 用户只有一个角色
  • 如果用户只能拥有一个角色,为什么还要使用数据透视表?
  • 您的RoleUser 表中除了user_idrole_id 之外还有其他列吗?

标签: php laravel laravel-5


【解决方案1】:

我在更新或创建新记录时使用此源代码。与 Laravel 5.2 配合得很好

如果存在一条记录有user_id == 你的user_id => 将更新role_id

否则将为您的user_id再插入一条记录

$roleUser = RoleUser::updateOrCreate([
    'user_id' => $request['user_id'],
    ], 
    [
        'role_id' => $request['role_id'],
    ]);

【讨论】:

  • Column not found: 1054 Unknown column 'id' in 'where clause' (SQL: update role_user` set role_id = 2 where id is null` 我得到了这个错误..在我使用了你的解决方案之后
  • @Hola 你的表没有id 列?
  • @Hola 我猜你在使用 ZizacoEntrust 角色?
  • 不,我尝试制作自己的授权概念。是的,在 RoleUser 模型中,我只有 user_id 和 role_id 没有其他列。
  • @Hola 所以请尝试再添加一列increments('id');
【解决方案2】:

这是一个应该可以工作的代码。但是,我不太了解您的数据库架构选择。如果一个用户只能有一个角色,为什么不在users表中定义一个role_id,然后使用belongsTo关系呢?

$role_user = RoleUser::where('role_id',$request->get('role_id'))
    ->where('user_id',$request->get('user_id'))
    ->first();

if (is_null($role_user)) {
    RoleUser::create([
        'user_id' => $request->get('user_id'),
        'role_id' => $request->get('role_id')
    ])
}

【讨论】:

    【解决方案3】:

    那么问题出在哪里?

    您正在使用firstOrNew 方法,它类似于firstOrCreate,通常执行以下操作:

    • 从数据库中选择

    • 如果不存在

    • 插入给定的数据

    • 如果使用 firstOrNew ,您需要->save() 来执行查询。

    所以如果存在,它不会更新您的数据。

    但是,我认为您正在寻找 updateOrCreate 方法,该方法采用两个数组参数,第一个是插入的数据,如果存在,该函数将采用两个数组参数来更新您的行。

    您也可能会遇到想要更新 现有模型或创建新模型(如果不存在)。 Laravel 提供 一个 updateOrCreate 方法可以一步完成。像 firstOrCreate 方法,updateOrCreate 持久化模型,所以没有 需要调用 save():

    $roleUser = RoleUser::updateOrCreate(
        // if not exists, insert the following RoleUser data
        ['role_id' => $request->Input(['role_id']),'user_id' =>$request->Input(['user_id'])],
        // otherwise, update RoleUser set role_id = ?
        ['role_id' => $request->Input(['role_id'])]
    );
    

    【讨论】:

    • 看看情况是,如果我下次选择一个用户作为管理员,如果我选择与用户相同的用户,它应该将管理员更新为用户,而不是在表中创建新行。可能是你不喜欢我的逻辑,但我想使用这个。所以如果一个用户选择为管理员并且下次同一用户选择为数据库中的用户,它将具有管理员和用户角色。
    • 检查您的 RoleUser 关系规则,或在查询中添加 where 子句以指定 user_id;
    【解决方案4】:

    $roleUser = RoleUser::firstOrNew(array('role_id' => Input::get('role_id'))); $roleUser ->save();

    您可以添加多个字段..

    例子..

    如果有从奥克兰到圣地亚哥的航班,请将价格设置为 99 美元。 如果不存在匹配的模型,请创建一个。

    $flight = App\Flight::updateOrCreate( ['departure' => 'Oakland', 'destination' => 'San Diego'], ['price' => 99] ); `

    【讨论】:

      猜你喜欢
      • 2020-05-30
      • 2020-02-14
      • 2017-04-28
      • 1970-01-01
      • 2014-11-27
      • 2016-06-09
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      相关资源
      最近更新 更多