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!

SoldadoCorp
fuente

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);
xdazz
fuente
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();
Benubird
fuente
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);
}
Dave
fuente
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' => '[email protected]',
    'votes' => 0
]);

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

Aamir
fuente
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 ;
Majbah Habib
fuente
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;
    }
}
Mujibur
fuente
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);
}
ngakak
fuente
15

Esto funcionó para mí en laravel 4.2

$id = User::insertGetId([
    'username' => Input::get('username'),
    'password' => Hash::make('password'),
    'active'   => 0
]);
usuario28864
fuente
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.');
    }
Qamar Uzman
fuente
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"=>"[email protected]"]);

Por DB

$id = DB::table('users')->insertGetId(["name"=>"Niklesh","email"=>"[email protected]"]);

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

Niklesh Raut
fuente
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
Amir
fuente
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);
Faridul Khan
fuente
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);
}
bobbybackblech
fuente
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

Abhishek Goel
fuente
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)
Tayyab Hussain
fuente
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);
}
Tanque HItesh
fuente
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);
Kamal Maisuriya
fuente
1

Puedes hacerlo:

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

$lastInsertId=app('db')->getPdo()->lastInsertId();
Dnyaneshwar Harer
fuente
1

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

$data = new YourModelName;
$data->name = 'Some Value';
$data->email = '[email protected]';
$data->save();
$lastInsertedId = $data->id;

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

PPL
fuente
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();
}
automezcla
fuente
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.

dustypaws - Reinstate a Monica
fuente
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;
}
Rasheduzzaman
fuente
0

Usando modelo elocuente

$user = new Report();        
$user->email= '[email protected]';  
$user->save();
$lastId = $user->id;

Usar el generador de consultas

$lastId = DB::table('reports')->insertGetId(['email' => '[email protected]']);
srmilon
fuente
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);
sabuz
fuente
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);
}
infomasud
fuente
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.

Priyanka Patel
fuente
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 
}
cuenta temporal
fuente
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

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

}
WebGhost
fuente