Obtenga la última identificación insertada usando Laravel Eloquent


294

Actualmente estoy usando el siguiente código para insertar datos en una tabla:

<?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);
    }
}

Quiero devolver la última ID insertada pero no sé cómo obtenerla.

¡Saludos cordiales!

Respuestas:


378

Después de guardar , $data->iddebe ser la última identificación insertada.

$data->save();
$data->id;

Se puede usar así.

return Response::json(array('success' => true, 'last_insert_id' => $data->id), 200);

Para una versión actualizada de laravel intente esto

return response()->json(array('success' => true, 'last_insert_id' => $data->id), 200);

2
Un objeto siempre devuelve un objeto, ofc. Este es el único camino a seguir.
Cas Bloem

40
Tenga en cuenta que si la identificación NO es autoincremento, esto siempre regresará 0. En mi caso, la identificación era una cadena (UUID) y para que esto funcione tuve que agregar public $incrementing = false;mi modelo.
Luís Cruz

2
@milz Tengo un activador MySQL que genera el uuid para un campo personalizado llamado aidy lo configuré, ¡ $incrementing = false;pero no regresa también!
SaidbakR

@SaidbakR, si bien es cierto, ¿puede indicar la sección del documento de Laravel donde obtuvo esta información tan importante?
Damilola Olowookere

@DamilolaOlowookere Esto es lo que encontré en mi aplicación que usa Laravel 5.4.
SaidbakR

121

xdazz tiene razón en este caso, pero para el beneficio de futuros visitantes que podrían estar usandoDB::statement o DB::insert, hay otra manera:

DB::getPdo()->lastInsertId();

43
En realidad, puedes hacerlo bien en el inserto$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
Casey

1
@Casey haciéndolo de esta manera no actualizará las marcas de tiempo en el DB
Rafael

@Rafael, si quieres actualizar timestampsusando insertGetId, por favor revisa aquí
Frank Myat Jue

¡Exactamente lo que estaba buscando el otro día! Además, insertGetIdsolo funciona si las columnas de id se llaman "id".
Capitán Hipertexto

@Benubird, tengo mi solución según tu respuesta.
Bhavin Thummar

58

Para cualquiera a quien también le guste cómo usa Jeffrey Way Model::create()en sus tutoriales de Laracasts 5, donde simplemente envía la Solicitud directamente a la base de datos sin establecer explícitamente cada campo en el controlador y usa los modelos $fillablepara la asignación masiva (muy importante, para cualquier persona nueva y que use de esta manera): leí a muchas personas que usan, insertGetId()pero desafortunadamente esto no respeta la $fillablelista blanca, por lo que obtendrá errores al intentar insertar _token y cualquier cosa que no sea un campo en la base de datos, termine configurando las cosas que desea filtro, etc. Eso me decepcionó, porque quiero usar la asignación masiva y, en general, escribir menos código cuando sea posible. Afortunadamente, el createmétodo de Eloquent simplemente envuelve el método de guardar (lo que @xdazz citó anteriormente), por lo que aún puede extraer la última ID creada ...

public function store() {

    $input = Request::all();
    $id = Company::create($input)->id;

    return redirect('company/'.$id);
}

2
Este ejemplo no funcionó para mí en 5.1, pero sí:$new = Company::create($input); return redirect('company/'.$new->id);
timgavin

2
Esto supone que el nombre de los campos de solicitud son los mismos que sus respectivas columnas de la base de datos. Lo que no siempre es el caso (códigos heredados, por ejemplo) ..
mosid

48

Si la tabla tiene una identificación de incremento automático, use el método insertGetId para insertar un registro y luego recuperar la ID:

$id = DB::table('users')->insertGetId([
    'email' => 'john@example.com',
    'votes' => 0
]);

Consulte: https://laravel.com/docs/5.1/queries#inserts


Lo que describió parece capturar la última inserción usando Fluent. La pregunta era sobre Eloquent. Se parecería más a: $ id = Model :: create ('votes' => 0]) -> id; Como se describe en esta respuesta anterior: stackoverflow.com/a/21084888/436443
Jeffz

46

**** Para Laravel ****

Primero cree un objeto, luego establezca el valor de los atributos para ese objeto, luego guarde el registro del objeto y luego obtenga la última identificación insertada. como

$user = new User();        

$user->name = 'John';  

$user->save();

// Ahora obteniendo la última identificación insertada

$insertedId = $user->id;

echo $insertedId ;

16

En laravel 5: puedes hacer esto:

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;
    }
}

15

Aquí hay un ejemplo:

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);
}

15

Esto funcionó para mí en laravel 4.2

$id = User::insertGetId([
    'username' => Input::get('username'),
    'password' => Hash::make('password'),
    'active'   => 0
]);

11

Así es como podemos obtener la última identificación insertada en Laravel 4

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.');
    }

11

Use insertGetIdpara insertar e insertarid al mismo tiempo

De doc

Si la tabla tiene una identificación de incremento automático, use el método insertGetId para insertar un registro y luego recuperar la ID:

Por Model

$id = Model::insertGetId(["name"=>"Niklesh","email"=>"myemail@gmail.com"]);

Por DB

$id = DB::table('users')->insertGetId(["name"=>"Niklesh","email"=>"myemail@gmail.com"]);

Para más detalles: https://laravel.com/docs/5.5/queries#inserts


6

Después de guardar el modelo, la instancia inicializada tiene el 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

6

Para insertar ()

Ejemplo:

$data1 = array(
         'company_id'    => $company_id,
         'branch_id'        => $branch_id
     );

$insert_id = CreditVoucher::insert($data1);
$id = DB::getPdo()->lastInsertId();
dd($id);

3

En Laravel 5.2 lo haría lo más limpio posible:

public function saveContact(Request $request, Contact $contact)
{
   $create = $contact->create($request->all());
   return response()->json($create->id,  201);
}

3

Después

$data->save()

$data->id le dará la identificación insertada,

Nota: Si el nombre de la columna de autoincremento es sno, entonces debe usar $data->snoy no$data->id


2

Después de guardar un registro en la base de datos, puede acceder a la identificación por$data->id

return Response::json(['success' => true, 'last_insert_id' => $data->id], 200)

2

Para Laravel, si inserta un nuevo registro y llama a $data->save()esta función, ejecuta una consulta INSERT y devuelve el valor de la clave primaria (es decir, id por defecto).

Puedes usar el siguiente código:

if($data->save()) {
    return Response::json(array('status' => 1, 'primary_id'=>$data->id), 200);
}

2
$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);

1

Puedes hacerlo:

$result=app('db')->insert("INSERT INTO table...");

$lastInsertId=app('db')->getPdo()->lastInsertId();

1

Para obtener la última identificación insertada en la base de datos, puede usar

$data = new YourModelName;
$data->name = 'Some Value';
$data->email = 'abc@mail.com';
$data->save();
$lastInsertedId = $data->id;

aquí $ lastInsertedId le dará la última identificación de incremento automático insertada.


1

El camino más corto es probablemente una llamada del refresh()modelo:

public function create(array $data): MyModel
{
    $myModel = new MyModel($dataArray);
    $myModel->saveOrFail();
    return $myModel->refresh();
}

1

Aunque esta pregunta es un poco anticuada. Mi solución rápida y sucia se vería así:

$last_entry = Model::latest()->first();

Pero supongo que es vulnerable a las condiciones de carrera en bases de datos altamente frecuentadas.


1
¡Gracias! Esto podría usarlo en mi tubería. Así que no te preocupes por las condiciones de carrera y el hermoso código.
Daantje

1

También puedes intentarlo así:

public function storeAndLastInrestedId() {
    $data = new ModelName();
    $data->title = $request->title;
    $data->save();

    $last_insert_id = $data->id;
    return $last_insert_id;
}

0

Usando modelo elocuente

$user = new Report();        
$user->email= 'johndoe@example.com';  
$user->save();
$lastId = $user->id;

Usar el generador de consultas

$lastId = DB::table('reports')->insertGetId(['email' => 'johndoe@example.com']);

0

Después de guardar $data->save(). Todos los datos se introducen en el interior $data. Como se trata de un objeto y la fila actual se acaba de guardar recientemente dentro $data. así que el último insertIdse encontrará dentro $data->id.

El código de respuesta será:

return Response::json(array('success' => true, 'last_insert_id' => $data->id), 200);


0

Puede obtener la última identificación insertada con el mismo objeto al que llama método de guardar;

$data->save();
$inserted_id = $data->id;

Entonces simplemente puedes escribir:

if ($data->save()) {
    return Response::json(array('success' => true,'inserted_id'=>$data->id), 200);
}

0

Puede recuperar fácilmente el último ID de registro insertado

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

Es un truco increíble para obtener Id del último registro insertado en el DB.


dos usuarios concurrentes que agregan el modelo de la compañía al mismo tiempo. esto no es confiable ya que la primera publicación podría obtener la identificación de la segunda si el momento es el correcto. La respuesta aceptada es confiable.
Alex

@Alex compruebe amablemente, esto está funcionando y la mejor solución para obtener la última identificación insertada de los registros.
Priyanka Patel

la solución actualizada está bien, sin embargo, requiere más código que la respuesta aceptada. Simplemente hacer $user->ides suficiente después de crear para obtener la identificación insertada.
Alex

-1
public function store( UserStoreRequest $request ) {
    $input = $request->all();
    $user = User::create($input);
    $userId=$user->id 
}

2
Esta publicación fue respondida hace 3 años. Edite su respuesta para agregar más explicaciones de por qué podría ayudar al usuario o cómo ayuda a resolver la pregunta del OP de una mejor manera.
Syfer

1
Gracias por este fragmento de código, que puede proporcionar ayuda inmediata. Una explicación adecuada mejoraría en gran medida su valor educativo al mostrar por qué esta es una buena solución al problema, y ​​la haría más útil para futuros lectores con preguntas similares, pero no idénticas. Edite su respuesta para agregar una explicación e indique qué limitaciones y supuestos se aplican. Sin mencionar la antigüedad de la pregunta y la baja calidad de su respuesta.
GrumpyCrouton

-1

Usando modelo elocuente

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;

}

Usar el generador de consultas

$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;

Para obtener más métodos para obtener la última identificación de fila insertada en Laravel: http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel


-1

Puede usar la $thisvariable de constructor para lograr el "Último Id insertado usando Laravel Eloquent" (sin agregar ninguna columna adicional) en la función o controlador actual.

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();

}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.