Laravel 获取最新插入用户的 id

Posted

技术标签:

【中文标题】Laravel 获取最新插入用户的 id【英文标题】:Laravel get id of latest inserted user 【发布时间】:2017-04-12 01:35:54 【问题描述】:

我正在使用 Laravel Auth 让用户能够注册。我现在正在尝试的是:用户注册后(如果他们选择了特殊角色),在另一个表(然后是用户)中插入了另一行,其中包含相关的用户 ID。这是它的代码:

<?php

namespace App\Http\Controllers\Auth;

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;
use App\Complaint;


class RegisterController extends Controller

    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    /**
     * Where to redirect users after login / registration.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    
        $this->middleware('guest');
    

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    
        return Validator::make($data, [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|min:6|confirmed',
            'username' => 'required|unique:users',
            'role' => 'required'
        ]);
    

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return User
     */
    protected function create(array $data)
    

        $user = new User;
        $user->name = $data['name'];
        $user->email = $data['email'];
        $user->username = $data['username'];
        $user->password = bcrypt($data['password']);
        $user->role = $data['role'];
        $user->templateURL = "";

        /*$user = User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'username' => $data['username'],
            'password' => bcrypt($data['password']),
            'role' => $data['role'],
            'templateURL' => ""
        ]);*/

        $user->save();


        if($data['role'] == 'Verkäufer')
            $complaintRow = Complaint::create([
               'user_id' => $user->id,
                'complaintCount' => 0
            ]);
        


        switch($data['role'])
            case 'Käufer':
                $user->attachRole(2);
                break;
            case 'Verkäufer':
                $user->attachRole(3);
                break;
            default:
                $user->attachRole(2);
                break;
        


        return $user;
    

但它不能正常工作,用户被插入以及投诉的一行,但不知何故$user-&gt;id 似乎为空,该列始终将user_id 设置为0。任何想法为什么会这样这个?

编辑:我现在可以工作了...实际上不是我发布的代码,我只是没有使complaint 表中的user_id 字段可填写,这就是为什么总是有 0,因为 0 是默认值,所以它没有设置它。

还是谢谢大家的回答。

【问题讨论】:

【参考方案1】:

试试这个:

$lastId = User::create($userData)->id;

【讨论】:

【参考方案2】:

$user-&gt;id 会在使用save() 方法后立即告诉您创建的用户 ID。

【讨论】:

【参考方案3】:

根据 Laravel Eloquent ORM,$user-&gt;id 将返回用户 ID。 如果你得到空值,那么保存时可能会出错。 (https://***.com/a/21084888/6628079)

保存后尝试打印$user

更新: 如果用户保存成功,如果在投诉表中添加数据会更好。

protected function create(array $data)


    $user = new User;
    $user->name = $data['name'];
    $user->email = $data['email'];
    $user->username = $data['username'];
    $user->password = bcrypt($data['password']);
    $user->role = $data['role'];
    $user->templateURL = "";

    /*$user = User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'username' => $data['username'],
        'password' => bcrypt($data['password']),
        'role' => $data['role'],
        'templateURL' => ""
    ]);*/

    if ($user->save()) 
        if ($data['role'] == 'Verkäufer') 
            $complaintRow = Complaint::create([
                'user_id' => $user->id,
                'complaintCount' => 0
            ]);
        


        switch ($data['role']) 
            case 'Käufer':
                $user->attachRole(2);
                break;
            case 'Verkäufer':
                $user->attachRole(3);
                break;
            default:
                $user->attachRole(2);
                break;
        


        return $user;
     else 
        // Your code if user doesn't save successfully.
    

【讨论】:

【参考方案4】:

这是因为,Eloquent 保存方法 bool 而不是新创建的实体的实例。如需确认结帐,请点击此链接:https://laravel.com/api/5.3/Illuminate/Database/Eloquent/Model.html

因此,如果您想获取新创建的实例,您可以使用用户创建方法或进行另一个查询来获取新插入的实例。第一个更好更容易。以下是你可以做到的:

$user = User::create([
    'name' => $data['name'],
    'email' => $data['email'],
    'username' => $data['username'],
    'password' => bcrypt($data['password']),
    'role' => $data['role'],
    'templateURL' => ""
]);

现在,您拥有包含 User 实例的 $user 变量。但要做到这一点,您需要考虑模型中的可填充/保证问题。我的意思是,在您的模型中,您必须添加以下行:

protected $fillabe = ['name', 'email', 'username', 'password', 'role', 'templateURL']

【讨论】:

是的,这就是我在我提供的代码中注释掉的代码,这以同样的问题结束...... 但不知何故,填充物帮助我解决了问题(即使它与 User 模型无关【参考方案5】:

id 列是否存在? 尝试在模型(用户)上设置$primaryKey = 'id'

$user-&gt;save 之后,您可以像$user-&gt;id 一样访问id 或者在$user-&gt;save 之后尝试从您的表中获取最大 id。

$user = User::select('id')->max('id')->first();

【讨论】:

【参考方案6】:

你做的最正确,你只需要改变,

当您保存用户对象时,它将返回已保存的用户对象,因此只需抓住该对象并在更多条件下使用即可。

$saved_user = $user->save();

if(!empty($saved_user))
      if($data['role'] == 'Verkäufer')
        
                    $complaintRow = Complaint::create([
                       'user_id' => $saved_user->id,
                        'complaintCount' => 0
                    ]);
                
   else 
     throw new error(500);


希望这会有所帮助谢谢:)

【讨论】:

@nameless 尝试包装 $saved_user 的 if 条件,以便我们知道用户正在正确保存。可能是您在保存用户而不是获取 id 时出错。 @nameless 你能告诉我们你的数据库表结构吗?和用户类

以上是关于Laravel 获取最新插入用户的 id的主要内容,如果未能解决你的问题,请参考以下文章

如何获取laravel中每个用户ID的最新行?

如何在 Laravel 5.5 中将数据插入表格并获取电子邮件通知?

获取关注者 laravel 的帖子

如何在 Laravel 中获取最新的活动记录?

Laravel 动态下拉获取数据问题

我如何获取最新的对象 laravel [重复]