如何在Eloquent ORM Laravel中获取最后插入的ID

24

我正在使用"Laravel"中的"Eloquent ORM"执行数据库操作。我只想获取数据库中最后插入的id(而不是最大id)。

我搜索了在Laravel的Eloquent ORM中如何获取最后插入的id,我找到了以下链接(Laravel, get last insert id using Eloquent),它指的是从以下函数"$data->save()"获取最后插入的id。

但我需要获取:

"Model::create($data)";

我的查询:

GeneralSettingModel::create($GeneralData);

User::create($loginuserdata);

如何检索最后插入的ID?


1
可能是Laravel使用Eloquent获取最后插入的ID的重复问题。 - Luís Cruz
如果表具有自增ID,请尝试使用以下方法:https://dev59.com/d2Ei5IYBdhLWcg3wptl_#46482971 - Niklesh Raut
11个回答

50

就像文档所说:插入、更新、删除

你也可以使用 create 方法在一行中保存一个新模型。插入的模型实例将从该方法返回给您。 但是,在这样做之前,您需要在模型上指定可填充(fillable)或保护(guarded)属性,因为所有 Eloquent 模型都会防止批量赋值。

在保存或创建使用自增 ID 的新模型后,您可以通过访问对象的 id 属性来检索 ID:

$insertedId = $user->id;

所以在你的样例中:

$user = User::create($loginuserdata);
$insertedId = $user->id;

然后在table2上,它将会是

$input['table2_id'] = $insertedId;
table2::create($input);

3
值得注意的是,该文档有误导性,因为它展示的第一种方法是->save();,但在我看来,它没有充分解释save()返回一个布尔值,而仅限于插入、更新和删除操作才会返回实例。特别是因为它表述为“保存或创建之后”。 - Wesley Smith

22

**** Laravel 专用 ****

$user = new User();

$user->name = 'John';

$user->save();

//Getting Last inserted id

$insertedId = $user->id;

$lastInsertedID = DB::table('users') ->insert( array( 'email_id' => $email_id, 'name' => $name ) ) ->lastInsertId(); - Majbah Habib
谢谢你的回答,但我已经解决了我的问题。问题在于 primaryKey。我在模型中改变了 primarykey,所以我没有得到最后一个id。将 primarykey 改为 id 后,问题得到了解决。 - Yasin Yörük
感谢您的回复。 - Majbah Habib

6
你可以像这样在insertGetId()方法中包装你的数据。
$id = DB::table('table')->insertGetId( $data );

在这种情况下,数组$data看起来会像这样
$data = [ 'field' => 'data' , 'field' => 'data' ];

如果你正在使用DB Facade,你可以在查询语句中添加lastInsertID()方法来获取最后插入的ID。

$lastInsertedID = DB::table('table')->insert( $data )->lastInsertId();

1
值得注意的是,insertGetId 只在列名实际上为 id 时才起作用。 - Captain Hypertext

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

2

您可以这样做:

public function store(Request $request,ModelName $obj)
{
        $lastInsertedId = $obj->create($request->all())->id;

}

希望这能帮到您。

2
如前面其他人所说,您可以使用以下方法检索ID:
$model->id;

但仅当你使用Eloquent的标准命名约定时才有效。如果你想使用其他名称作为主键列,例如:

class Users extends Model{
    $primaryKey = 'userid';
}

您可以通过调用以下方法来检索最后插入的id:
$model->userid;

在文档https://laravel.com/docs/master/eloquent#eloquent-model-conventions中描述了以下内容:

Eloquent还会假设每个表都有一个名为id的主键列。您可以定义$primaryKey属性来覆盖此约定。

此外,Eloquent假定主键是递增的整数值,这意味着默认情况下主键将自动转换为int类型。如果要使用非递增或非数字主键,则必须将模型的public $incrementing属性设置为false。


亲爱的@Krzysiek Grzembski,我需要在我的控制器中使用它。我按照您在模型中编写的方式进行了更改。但是现在$model->userid;是不可访问的。我需要在我的控制器中使用它。请指导... - Raham
@Raham,请查看我的更新答案。没有任何代码片段很难确定你的问题所在。 - Krzysiek Grzembski
实际上我解决了我的问题。我的问题是如何从表中检索最后插入的一个。现在我查看了你的答案,知道了如何返回最后插入的一个,以及你在哪里定义了 $model... - Raham
问题在于触发器生成的键。 - SaidbakR

2
这是一个雄辩的模型:
$user = new Reports();        
$user->email= 'david@example.com';  
$user->save();
$lastInsertId = $user->id;

一种使用查询构建器的解决方案:
 $lastInsertId = DB::table('reports')->insertGetId(['email' => 'david@example.com']);

2
这是我的尝试:
$model_ins = Model::orderBy('id', 'desc')->take(1)->first();

And use $model_ins->id.


1
$user = (new user)->create($request->all()) ;

        \Session::flash('message', 'Thanks , Your record No (' .$user->id . ') has been Successfully added');

这是我的解决方案。我返回插入的对象并获取其ID或其他属性。

1
这段代码适用于Laravel 5.3:

$upstatus = User::create($status);
return response()->json($upstatus);

用户页面/站点我称之为data.id

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