Obter o último ID inserido usando o Laravel Eloquent

294

Atualmente, estou usando o código abaixo para inserir dados em uma tabela:

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

Quero retornar o último ID inserido, mas não sei como obtê-lo.

Atenciosamente!

SoldierCorp
fonte

Respostas:

378

Após salvar , $data->iddeve ser o último ID inserido.

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

Pode ser usado assim.

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

Para a versão atualizada do laravel, tente isto

return response()->json(array('success' => true, 'last_insert_id' => $data->id), 200);
xdazz
fonte
2
Um objeto sempre retorna um objeto, ofc. Este é o único caminho a percorrer.
precisa
40
Lembre-se de que, se o ID NÃO for incremento automático, ele sempre retornará 0. No meu caso, o id era uma string (UUID) e, para isso funcionar, tive que adicionar public $incrementing = false;no meu modelo.
Luís Cruz
2
@ milz Eu tenho o MySQL trigger que gera o uuid para um campo personalizado chamado aide eu configurei, $incrementing = false;mas ele não retornou também!
precisa saber é o seguinte
@SaidbakR, enquanto verdadeiro, você pode indicar a seção do documento do Laravel onde você obteve essas informações muito importantes?
Damilola Olowookere
@DamilolaOlowookere Foi o que eu encontrei no meu aplicativo que usa o Laravel 5.4.
SaidbakR
121

O xdazz está certo nesse caso, mas para o benefício de futuros visitantes que possam estar usando DB::statementou DB::insert, existe outra maneira:

DB::getPdo()->lastInsertId();
Benubird
fonte
43
Na verdade, você pode fazê-lo na inserção$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
Casey
1
@Casey fazê-lo desta maneira não irá atualizar os carimbos no DB
Rafael
@Rafael, se você deseja atualizar timestampsusando insertGetId, gentilmente verificar aqui
Frank Myat Qui
Exatamente o que eu estava procurando no outro dia! Além disso, insertGetIdsó funciona se as colunas de identificação forem realmente chamadas de "id".
Captain Hypertext
@ Benubird, eu tenho minha solução de acordo com sua resposta.
Bhavin Thummar 28/08/18
58

Para quem também gosta de como Jeffrey Way usa Model::create()em seus tutoriais do Laracasts 5, onde ele envia a solicitação diretamente para o banco de dados sem definir explicitamente cada campo no controlador e usar o modelo $fillablepara atribuição em massa (muito importante para quem é novo e usa desta maneira): eu leio muitas pessoas usando, insertGetId()mas infelizmente isso não respeita a $fillablelista de permissões, então você receberá erros ao tentar inserir _token e qualquer coisa que não seja um campo no banco de dados, acabando definindo as coisas que deseja filtro etc. Isso me chateou, porque eu quero usar a atribuição em massa e escrever menos código quando possível. Felizmente, o createmétodo do Eloquent apenas envolve o método save (o que @xdazz citou acima), para que você ainda possa obter o último ID criado ...

public function store() {

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

    return redirect('company/'.$id);
}
Dave
fonte
2
Este exemplo não funcionou para mim no 5.1, mas funcionou:$new = Company::create($input); return redirect('company/'.$new->id);
timgavin 19/09/15
2
Isso pressupõe que o nome dos campos de solicitação seja igual às suas respectivas colunas do banco de dados. Que nem sempre é o caso (códigos legados, por exemplo) ..
mosid
48

Se a tabela tiver um ID de incremento automático, use o método insertGetId para inserir um registro e recupere o ID:

$id = DB::table('users')->insertGetId([
    'email' => '[email protected]',
    'votes' => 0
]);

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

Aamir
fonte
O que você descreveu é como capturar a última inserção usando o Fluent. A pergunta era sobre Eloquent. Seria mais parecido com: $ id = Model :: create ('votes' => 0]) -> id; Conforme descrito nesta resposta acima: stackoverflow.com/a/21084888/436443
Jeffz 10/07/18
46

**** Para o Laravel ****

Primeiro, crie um objeto, defina o valor dos atributos para esse objeto, salve o registro do objeto e obtenha o último ID inserido. tal como

$user = new User();        

$user->name = 'John';  

$user->save();

// Agora obtendo o último ID inserido

$insertedId = $user->id;

echo $insertedId ;
Majbah Habib
fonte
16

No laravel 5: você pode fazer isso:

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
fonte
15

Aqui está um exemplo:

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
fonte
15

Isso funcionou para mim no laravel 4.2

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

Aqui está como podemos obter o último ID inserido no 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
fonte
11

Use insertGetIdpara inserir e ser inserido idao mesmo tempo

Do doc

Se a tabela tiver um ID de incremento automático, use o método insertGetId para inserir um registro e recupere o ID:

De Model

$id = Model::insertGetId(["name"=>"Niklesh","email"=>"[email protected]"]);

De DB

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

Para mais detalhes: https://laravel.com/docs/5.5/queries#inserts

Niklesh Raut
fonte
6

Após salvar o modelo, a instância inicializada possui o 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
fonte
6

Para insert ()

Exemplo:

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

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

No Laravel 5.2, eu o tornaria o mais limpo possível:

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

Depois de

$data->save()

$data->id fornecerá o ID inserido,

Nota: Se o nome da coluna de incremento automático for sno , você deverá usar $data->snoe não$data->id

Abhishek Goel
fonte
2

Depois de salvar um registro no banco de dados, você pode acessar id por$data->id

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

Para o Laravel, se você inserir um novo registro e chamar $data->save()essa função, executará uma consulta INSERT e retornará o valor da chave primária ( por exemplo, id por padrão).

Você pode usar o seguinte código:

if($data->save()) {
    return Response::json(array('status' => 1, 'primary_id'=>$data->id), 200);
}
HItesh Tank
fonte
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
fonte
1

Você consegue fazer isso:

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

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

Para obter o último ID inserido no banco de dados Você pode usar

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

aqui $ lastInsertedId fornece o último ID de incremento automático inserido.

PPL
fonte
1

A maneira mais curta é provavelmente uma chamada do refresh()modelo:

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

Embora esta questão seja um pouco datada. Minha solução rápida e suja ficaria assim:

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

Mas acho que é vulnerável às condições de corrida em bancos de dados altamente freqüentados.

dustypaws - Restabelecer Monica
fonte
1
Obrigado! Isso eu poderia usar no meu pipeline. Portanto, não se preocupe com condições de corrida e código bonito.
Daantje
1

Você também pode tentar assim:

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

    $last_insert_id = $data->id;
    return $last_insert_id;
}
Rasheduzzaman
fonte
0

Usando o modelo eloquente

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

Usando o Query Builder

$lastId = DB::table('reports')->insertGetId(['email' => '[email protected]']);
srmilon
fonte
0

Após salvar $data->save(). todos os dados são enviados para dentro $data. Como este é um objeto, a linha atual é salva recentemente recentemente $data. então o último insertIdserá encontrado lá dentro $data->id.

O código de resposta será:

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

O método opcional será:

$lastID = DB::table('EXAMPLE-TABLE')
                ->orderBy('id', 'desc')
                ->first();

$lastId = $lastProduct->id;

Fonte da versão Laravel 5.8

Gustavo Morillo Marin
fonte
0

Você pode obter o último ID inserido com o mesmo objeto que você chama de método save;

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

Então você pode simplesmente escrever:

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

Você pode buscar facilmente o último ID do registro inserido

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

É um truque incrível para buscar o ID do último registro inserido no banco de dados.

Priyanka Patel
fonte
dois usuários simultâneos adicionando ao modelo da empresa ao mesmo tempo. isso não é confiável, pois a 1ª postagem pode obter o ID da 2ª se o momento for correto. a resposta aceita é confiável.
Alex
@ Alex, por favor, verifique se está funcionando e a melhor solução para obter o último ID inserido nos registros.
Priyanka Patel
a solução atualizada está correta, no entanto, requer mais código do que a resposta aceita. Basta fazer o $user->idsuficiente após a criação para obter o ID inserido.
Alex
-1
public function store( UserStoreRequest $request ) {
    $input = $request->all();
    $user = User::create($input);
    $userId=$user->id 
}
conta temporária
fonte
2
Esta postagem foi respondida há 3 anos. Edite sua resposta para adicionar mais explicações sobre por que ela pode ajudar o usuário ou como ela ajuda a resolver a pergunta do OP de uma maneira melhor.
Syfer 8/17
1
Obrigado por este trecho de código, que pode fornecer ajuda imediata. Uma explicação adequada melhoraria bastante seu valor educacional, mostrando por que essa é uma boa solução para o problema e a tornaria mais útil para futuros leitores com perguntas semelhantes, mas não idênticas. Edite sua resposta para adicionar uma explicação e forneça uma indicação de quais limitações e suposições se aplicam. Sem mencionar a idade da pergunta e a baixa qualidade da sua resposta.
GrumpyCrouton
-1

Usando o modelo eloquente

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;

}

Usando o Query Builder

$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 obter mais métodos para obter o ID da última linha inserida no Laravel: http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel

Karthik
fonte
-1

Você pode usar a $thisvariável construtora para obter "Última identificação inserida usando o Laravel Eloquent" (sem adicionar nenhuma coluna extra) na função ou controlador atual.

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
fonte