Laravel 获取最新插入用户的ID

6

我正在使用 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->id似乎为空,该列始终将user_id设置为0。有任何想法为什么会这样吗?
编辑:我现在让它工作了...实际上不是我发布的代码,我只是没有使投诉表中的user_id字段可填充,这就是为什么总是有0的原因,因为0是默认值,所以它没有设置它。
无论如何,感谢所有的答案。
6个回答

2
根据Laravel Eloquent ORM,$user->id将返回用户的ID。如果您得到null,则可能保存时出现错误。(https://dev59.com/d2Ei5IYBdhLWcg3wptl_#21084888
尝试在保存后打印$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.
    }
}

2
这是因为Eloquent的保存方法返回bool而不是新创建实体的实例。要确认,请查看此链接:https://laravel.com/api/5.3/Illuminate/Database/Eloquent/Model.html 因此,如果您想获取新创建的实例,可以使用create方法或进行另一个查询以获取新插入的实例。第一个方法更好且更容易。以下是如何做到这一点:
$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']

是的,那是我在提供的代码中注释掉的代码,这会导致相同的问题... - nameless
但不知何故,fillable 属性帮助我解决了问题(即使它与“User”模型无关)。 - nameless

1

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

$user->save之后,您可以访问id,如$user->id 或者在$user->save之后,尝试从您的表中获取最大的id。

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

0

试试这个:

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

0

$user->id会在使用save()方法后告诉你创建的用户的ID。


0

你做得差不多正确,只需要更改一下:

当你保存用户对象时,它会返回已保存的用户对象,所以只需获取该对象并在后续条件中使用即可。

$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。 - Binit Ghetiya
@nameless,你能否展示一下你的数据库表结构和用户类? - Binit Ghetiya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接