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->id
似乎为空,该列始终将user_id
设置为0。任何想法为什么会这样这个?
编辑:我现在可以工作了...实际上不是我发布的代码,我只是没有使complaint
表中的user_id
字段可填写,这就是为什么总是有 0,因为 0 是默认值,所以它没有设置它。
还是谢谢大家的回答。
【问题讨论】:
【参考方案1】:试试这个:
$lastId = User::create($userData)->id;
【讨论】:
【参考方案2】:$user->id
会在使用save()
方法后立即告诉您创建的用户 ID。
【讨论】:
【参考方案3】:根据 Laravel Eloquent ORM,$user->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->save
之后,您可以像$user->id
一样访问id
或者在$user->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的主要内容,如果未能解决你的问题,请参考以下文章