使用 Laravel Eloquent 获取最后插入的 ID
Posted
技术标签:
【中文标题】使用 Laravel Eloquent 获取最后插入的 ID【英文标题】:Get the Last Inserted Id Using Laravel Eloquent 【发布时间】:2014-01-31 19:37:36 【问题描述】:我目前正在使用以下代码在表格中插入数据:
<?php
public function saveDetailsCompany()
$post = Input::All();
$data = new Company;
$data->nombre = $post['name'];
$data->direccion = $post['address'];
$data->telefono = $post['phone'];
$data->email = $post['email'];
$data->giro = $post['type'];
$data->fecha_registro = date("Y-m-d H:i:s");
$data->fecha_modificacion = date("Y-m-d H:i:s");
if ($data->save())
return Response::json(array('success' => true), 200);
我想返回最后插入的 ID,但我不知道如何获取它。
亲切的问候!
【问题讨论】:
$id = DB::table('users')->insertGetId(array('email' => 'john@example.com', 'votes' => 0) );跨度> 【参考方案1】:保存之后,$data->id
应该是最后插入的 id。
$data->save();
$data->id;
可以这样使用。
return Response::json(array('success' => true, 'last_insert_id' => $data->id), 200);
要更新 laravel 版本试试这个
return response()->json(array('success' => true, 'last_insert_id' => $data->id), 200);
【讨论】:
一个对象总是返回一个对象,ofc。这是唯一的出路。 请注意,如果 id 不是自动递增的,这将始终返回0
。在我的例子中,id 是一个字符串 (UUID),为此我必须在我的模型中添加 public $incrementing = false;
。
@milz 我有 mysql 触发器,它为名为 aid
的自定义字段生成 uuid,我已经设置了 $incrementing = false;
,但它也没有返回!
@SaidbakR 虽然是真的,但请您指出您获得此非常重要信息的 Laravel 文档部分吗?
@DamilolaOlowookere 这是我在使用 Laravel 5.4 的应用程序中发现的。【参考方案2】:
这是一个例子:
public static function saveTutorial()
$data = Input::all();
$Tut = new Tutorial;
$Tut->title = $data['title'];
$Tut->tutorial = $data['tutorial'];
$Tut->save();
$LastInsertId = $Tut->id;
return Response::json(array('success' => true,'last_id'=>$LastInsertId), 200);
【讨论】:
【参考方案3】:xdazz 在这种情况下是正确的,但是为了将来可能使用DB::statement
或DB::insert
的访问者的利益,还有另一种方法:
DB::getPdo()->lastInsertId();
【讨论】:
其实你可以直接在插入$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
@Casey 这样做不会更新数据库中的时间戳
@Rafael,如果您想使用insertGetId
更新timestamps
,请查看here
正是我前几天在寻找的东西!此外,insertGetId
仅在 id 列实际上称为“id”时才有效。
@Benubird,我根据你的回答得到了解决方案。【参考方案4】:
这是我们如何在 Laravel 4 中获取最后插入的 id
public function store()
$input = Input::all();
$validation = Validator::make($input, user::$rules);
if ($validation->passes())
$user= $this->user->create(array(
'name' => Input::get('name'),
'email' => Input::get('email'),
'password' => Hash::make(Input::get('password')),
));
$lastInsertedId= $user->id; //get last inserted record's user id value
$userId= array('user_id'=>$lastInsertedId); //put this value equal to datatable column name where it will be saved
$user->update($userId); //update newly created record by storing the value of last inserted id
return Redirect::route('users.index');
return Redirect::route('users.create')->withInput()->withErrors($validation)->with('message', 'There were validation errors.');
【讨论】:
【参考方案5】:在 laravel 5 中:你可以这样做:
use App\Http\Requests\UserStoreRequest;
class UserController extends Controller
private $user;
public function __construct( User $user )
$this->user = $user;
public function store( UserStoreRequest $request )
$user= $this->user->create([
'name' => $request['name'],
'email' => $request['email'],
'password' => Hash::make($request['password'])
]);
$lastInsertedId= $user->id;
【讨论】:
【参考方案6】:这在 laravel 4.2 中对我有用
$id = User::insertGetId([
'username' => Input::get('username'),
'password' => Hash::make('password'),
'active' => 0
]);
【讨论】:
【参考方案7】:对于同样喜欢 Jeffrey Way 在他的 Laracasts 5 教程中如何使用 Model::create()
的任何人,他只是将请求直接发送到数据库中,而无需在控制器中明确设置每个字段,并使用模型的 $fillable
进行批量分配(非常重要,对于任何新的和使用这种方式的人):我读过很多人使用insertGetId()
但不幸的是,这不尊重$fillable
白名单,所以你会在尝试插入 _token 和任何其他内容时遇到错误'不是数据库中的一个字段,最终设置了你想要过滤的东西,等等。这让我很沮丧,因为我想使用批量分配并尽可能减少整体编写的代码。幸运的是,Eloquent 的 create
method 只是包装了 save 方法(上面引用了 @xdazz 的内容),所以您仍然可以提取最后创建的 ID...
public function store()
$input = Request::all();
$id = Company::create($input)->id;
return redirect('company/'.$id);
【讨论】:
这个例子在 5.1 中对我不起作用,但确实如此:$new = Company::create($input);
return redirect('company/'.$new->id);
这假定请求字段名称与其各自的数据库列相同。情况并非总是如此(例如遗留代码)..【参考方案8】:
保存模型后,初始化的实例有id:
$report = new Report();
$report->user_id = $request->user_id;
$report->patient_id = $request->patient_id;
$report->diseases_id = $request->modality;
$isReportCreated = $report->save();
return $report->id; // this will return the saved report id
【讨论】:
【参考方案9】:保存记录到数据库后,您可以通过$data->id
访问id
return Response::json(['success' => true, 'last_insert_id' => $data->id], 200)
【讨论】:
【参考方案10】:在 Laravel 5.2 中,我会使其尽可能干净:
public function saveContact(Request $request, Contact $contact)
$create = $contact->create($request->all());
return response()->json($create->id, 201);
【讨论】:
【参考方案11】:**** 对于 Laravel ****
首先创建一个对象,然后为该对象设置属性值,然后保存对象记录,然后获取最后插入的id。比如
$user = new User();
$user->name = 'John';
$user->save();
// 现在获取最后插入的 id
$insertedId = $user->id;
echo $insertedId ;
【讨论】:
【参考方案12】:如果表有自增id,使用insertGetId方法插入一条记录,然后取回ID:
$id = DB::table('users')->insertGetId([
'email' => 'john@example.com',
'votes' => 0
]);
参考:https://laravel.com/docs/5.1/queries#inserts
【讨论】:
您描述的内容看起来像使用 Fluent 捕获最后一个插入。问题是关于雄辩的。它看起来更像: $id = Model::create('votes' => 0])->id;如上述答案所述:***.com/a/21084888/436443 当然,正如其他 cmets 中提到的,不要忘记使用insert
会忽略事件和 $fillable
,所以要考虑到这一点!【参考方案13】:
对于 Laravel,如果您插入新记录并调用 $data->save()
,此函数将执行 INSERT 查询并返回主键值(即默认情况下为 id)。
您可以使用以下代码:
if($data->save())
return Response::json(array('status' => 1, 'primary_id'=>$data->id), 200);
【讨论】:
【参考方案14】:之后
$data->save()
$data->id
会给你插入的 id,
注意:如果您的自动增量列名称是 sno,那么您应该使用
$data->sno
而不是 $data->id
【讨论】:
【参考方案15】:保存$data->save()
后。所有数据都被推入$data
。因为这是一个对象,并且当前行最近才保存在 $data
中。所以最后一个insertId
将在$data->id
中找到。
响应代码将是:
return Response::json(array('success' => true, 'last_insert_id' => $data->id), 200);
【讨论】:
【参考方案16】:你可以这样做:
$result=app('db')->insert("INSERT INTO table...");
$lastInsertId=app('db')->getPdo()->lastInsertId();
【讨论】:
【参考方案17】:public function store( UserStoreRequest $request )
$input = $request->all();
$user = User::create($input);
$userId=$user->id
【讨论】:
这篇文章是 3 年前回答的。请编辑您的答案以添加更多解释,说明为什么它可能会帮助用户或它如何帮助以更好的方式解决 OP 的问题。 感谢您提供此代码 sn-p,它可能会提供一些即时帮助。正确解释would greatly improve 其教育价值,说明为什么这是一个很好的问题解决方案,并将使其对未来有类似但不相同问题的读者更有用。请编辑您的答案以添加解释,并说明适用的限制和假设。更不用说问题的年龄和答案的低质量了。 谨防使用此代码,因为这里没有验证。未经验证,您不应存储任何信息。【参考方案18】:使用insertGetId
同时插入和被插入id
来自doc
如果表有自增id,使用insertGetId方法 插入一条记录然后检索 ID:
Model
$id = Model::insertGetId(["name"=>"Niklesh","email"=>"myemail@gmail.com"]);
DB
$id = DB::table('users')->insertGetId(["name"=>"Niklesh","email"=>"myemail@gmail.com"]);
更多详情:https://laravel.com/docs/5.5/queries#inserts
【讨论】:
【参考方案19】:使用 Eloquent 模型
$user = new Report();
$user->email= 'johndoe@example.com';
$user->save();
$lastId = $user->id;
使用查询生成器
$lastId = DB::table('reports')->insertGetId(['email' => 'johndoe@example.com']);
【讨论】:
【参考方案20】:获取数据库中最后插入的 id 你可以使用
$data = new YourModelName;
$data->name = 'Some Value';
$data->email = 'abc@mail.com';
$data->save();
$lastInsertedId = $data->id;
这里 $lastInsertedId 将为您提供最后插入的自动增量 ID。
【讨论】:
【参考方案21】:$objPost = new Post;
$objPost->title = 'Title';
$objPost->description = 'Description';
$objPost->save();
$recId = $objPost->id; // If Id in table column name if other then id then user the other column name
return Response::json(['success' => true,'id' => $recId], 200);
【讨论】:
【参考方案22】:使用 Eloquent 模型
use App\Company;
public function saveDetailsCompany(Request $request)
$createcompany=Company::create(['nombre'=>$request->input('name'),'direccion'=>$request->input('address'),'telefono'=>$request->input('phone'),'email'=>$request->input('emaile'),'giro'=>$request->input('type')]);
// Last Inserted Row ID
echo $createcompany->id;
使用查询生成器
$createcompany=DB::table('company')->create(['nombre'=>$request->input('name'),'direccion'=>$request->input('address'),'telefono'=>$request->input('phone'),'email'=>$request->input('emaile'),'giro'=>$request->input('type')]);
echo $createcompany->id;
在 Laravel 中获取 Last Inserted Row id 的更多方法:http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel
【讨论】:
【参考方案23】:对于插入()
例子:
$data1 = array(
'company_id' => $company_id,
'branch_id' => $branch_id
);
$insert_id = CreditVoucher::insert($data1);
$id = DB::getPdo()->lastInsertId();
dd($id);
【讨论】:
不知道这个 lastInsertId()。谢谢人【参考方案24】:最短的方法可能是在模型上调用refresh()
:
public function create(array $data): MyModel
$myModel = new MyModel($dataArray);
$myModel->saveOrFail();
return $myModel->refresh();
【讨论】:
【参考方案25】:虽然这个问题有点过时了。我的快速而肮脏的解决方案如下所示:
$last_entry = Model::latest()->first();
但我猜它很容易受到频繁使用的数据库上的竞争条件的影响。
【讨论】:
谢谢!我可以在我的管道中使用它。所以不用担心竞争条件和漂亮的代码。【参考方案26】:可选方法是:
$lastID = DB::table('EXAMPLE-TABLE')
->orderBy('id', 'desc')
->first();
$lastId = $lastProduct->id;
Source from Laravel 5.8 version
【讨论】:
【参考方案27】:您可以使用调用 save 方法的相同对象获取最后插入的 id;
$data->save();
$inserted_id = $data->id;
所以你可以简单地写:
if ($data->save())
return Response::json(array('success' => true,'inserted_id'=>$data->id), 200);
【讨论】:
【参考方案28】:您可以在当前函数或控制器中使用$this
构造函数变量来实现“Last Inserted Id Using Laravel Eloquent”(无需添加任何额外的列)。
public function store(Request $request)
$request->validate([
'title' => 'required|max:255',
'desc' => 'required|max:5000'
]);
$this->project = Project::create([
'name' => $request->title,
'description' => $request->desc,
]);
dd($this->project->id); //This is your current/latest project id
$request->session()->flash('project_added','Project added successfully.');
return redirect()->back();
【讨论】:
【参考方案29】:你也可以这样试试:
public function storeAndLastInrestedId()
$data = new ModelName();
$data->title = $request->title;
$data->save();
$last_insert_id = $data->id;
return $last_insert_id;
【讨论】:
【参考方案30】:您可以轻松获取最后插入的记录 ID
$user = User::create($userData);
$lastId = $user->value('id');
从数据库中最后插入的记录中获取 Id 是一个很棒的技巧。
【讨论】:
两个并发用户同时添加到公司模型。这是不可靠的,因为如果时机合适,第 1 篇文章可能会获得第 2 篇文章的 id。接受的答案是可靠的。 @Alex 请检查一下,这是有效的,也是从记录中获取最后插入的 id 的最佳解决方案。 更新后的解决方案很好,但是它需要比接受的答案更多的代码。创建后只需执行$user->id
即可获取插入的ID。以上是关于使用 Laravel Eloquent 获取最后插入的 ID的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Eloquent ORM laravel 中获取最后一个插入 ID
Laravel Eloquent/MySQL 如何从每个父记录的最后一个条目中获取去年的记录?
如何使用 Eloquent::insert() 获取最后插入的 id