【问题标题】:Laravel 5.2 - How to get id of newly created user and pass it to a controllerLaravel 5.2 - 如何获取新创建用户的 id 并将其传递给控制器
【发布时间】:2016-09-07 16:23:40
【问题描述】:

我以前从未使用过 Laravel,我正在使用 laravel 默认用户注册和表单的第 1 步的身份验证进行 3 部分注册。每个步骤都有自己的表格。 step 1s 表的 id 列用于链接所有 3 个表。

目前我使用$id = Auth::user()->id 在第 2 步控制器中获取登录用户 ID。相反,如何在创建用户后将 id 路由/传递到第 2 步控制器存储方法并将视图重定向到第 2 步?

在授权控制器中

protected function create(array $data)
{

    return User::create([
        'email' => $data['email'],
        'password' => bcrypt($data['password']),
        'firstName' => $data['firstName'],
        'middleName' => $data['middleName'],
        'lastName' => $data['lastName'],
    ]);
}

在 Illuminate\Foundation\Auth\RegistersUsers 中;

public function register(Request $request)
{
    $validator = $this->validator($request->all());

    if ($validator->fails()) {
        $this->throwValidationException(
            $request, $validator
        );
    }

    Auth::guard($this->getGuard())->login($this->create($request->all()));

    // pass id to store method in profile and redirect to profileinfo 
    return view('user/profileinfo');
}

}

【问题讨论】:

  • 使用 $id = Auth::user()->id 有什么问题?
  • @Abhishek 因为在每个控制器中,我都必须有一个 getId 函数来确保每个用户都已登录并返回 id。我在想最好将 id 作为参数传递给每个控制器中的 store 方法

标签: laravel


【解决方案1】:

您可以通过这种方式更改 AuthController 中的创建方法:

protected function create(array $data)
{
    $user =  User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => bcrypt($data['password']),

    ]);

    $id= $user->id; // Get current user id

    return $user;
}

【讨论】:

  • 这是最好的答案。
  • 这个答案最好,打勾的答案创建登录实现失败;
【解决方案2】:

您可以将create() 函数更改为

protected function create(array $data)
{
  $user = new User();
  $user->email = $data['email'];
  $user->password = bcrypt($data['password']),
  $user->firstName = $data['firstName'],
  $user->middleName = $data['middleName'],
  $user->lastName = $data['lastName'];
  $user->save();

  return $user->id;
 }

【讨论】:

    【解决方案3】:

    您应该使用返回模型的save() 方法,而不是使用返回truefalsecreate() 方法:

    $id = $data->save()->id;
    

    但如果你仍然需要简短的语法,你可以使用mass assignment:

    $userModel = new User($data);
    $userModel->save();
    $id = $userModel->id;
    

    【讨论】:

    • 我有点困惑。您在其他评论中说不要使用 save 。我是否在当前创建方法中添加$id = $data->save()->id;?还是我替换 create?
    • 我不认为我说你不应该使用save() 方法。我会尽力解释。你可以使用create() 方法,因为它是一个很好的捷径。但是,如果您需要获取最后插入的 id,您别无选择,应该使用普通的旧 save() 方法。
    【解决方案4】:

    试试这个方法:

    $data = new FooModel(); // or in your case User();
    $data->column_1 = 'value_1';
    $data->column_2 = 'value_2';
    $data->save();
    

    现在在调用save() 之后,$data->id 应该给你最后插入的 ID,这样你就可以在任何你想要的地方使用它。

    请记住,如果 PK 列(带有 ID 的那一列)不是自增,它将始终返回 0。

    【讨论】:

    • 如果我将创建方法更改为使用 save 而不是 User::create 会更改/弄乱身份验证吗?如果是这样的话,我宁愿坚持使用默认身份验证
    • 搞乱数据库操作(在这种情况下是插入)与身份验证无关。在抱怨之前尝试这种方法。 :)
    • 老实说我不是在抱怨,我真的很想知道。感谢您的帮助。
    • 不用担心。总是在你做了一些工作之后开始怀疑,而不是之前。这将为您节省大量时间。 :) 祝你好运!如果这样做了,请接受答案。
    • @michealb,如果您将save() 更改为create() 它将不起作用,因为create() 返回truefalse,但不是模型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 2021-06-22
    相关资源
    最近更新 更多