Laravel Eloquent Kullanarak Son Eklenen Kimliği Alın


294

Şu anda bir tabloya veri eklemek için aşağıdaki kodu kullanıyorum:

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

Eklenen son kimliği döndürmek istiyorum ama nasıl alacağımı bilmiyorum.

Saygılarımla!

Yanıtlar:


380

Kaydettikten sonra , $data->ideklenen son kimlik olmalıdır.

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

Bu şekilde kullanılabilir.

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

Güncellenmiş laravel sürümü için bunu deneyin

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

2
Bir nesne her zaman bir nesne döndürür, ofc. Bu tek yol.
Cas Bloem

40
Kimlik otomatik yinelenme DEĞİLSE, bunun her zaman geri döneceğini unutmayın 0. Benim durumumda id bir dize (UUID) ve bunun çalışması için public $incrementing = false;benim model eklemek zorunda kaldı .
Luís Cruz

2
@milz Ben adında özel bir alan için uuid oluşturmak MySQL tetik var aidve ben ayarladım $incrementing = false;ama Çok geri dönmez!
SaidbakR

@SaidbakR doğru olsa da, lütfen Laravel belgesinin bu çok önemli bilgiyi aldığınız bölümünü belirtir misiniz?
Damilola Olowookere

@DamilolaOlowookere Laravel 5.4 kullanan uygulamamda bulduğum bu.
SaidbakR

121

xdazz bu durumda doğrudur, ancak gelecekteki ziyaretçilerin yararına DB::statementya DB::insertda başka bir yol vardır:

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

43
Aslında bunu $id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
Casey

1
@Casey bu şekilde yapıyor DB'deki zaman damgalarını güncellemeyecek
Rafael

@Rafael, timestampskullanarak güncellemek istiyorsanız insertGetId, lütfen buraya bakın
Frank Myat Per

Geçen gün tam olarak aradığım şey! Ayrıca, insertGetIdyalnızca id sütunlarına gerçekten "id" adı verilirse çalışır.
Kaptan Hypertext

@Benubird, cevabınıza göre çözümümü aldım.
Bhavin Thummar

58

Jeffrey Way'in Model::create()Laracasts 5 derslerinde de nasıl kullanıldığını seven herkes için , İsteği kontrolördeki her alanı açıkça ayarlamadan ve modelin $fillabletoplu atama için kullanmadan doğrudan veritabanına gönderir (çok önemli, yeni ve kullanan herkes için Bu şekilde): Kullanan birçok insan okudum insertGetId()ama maalesef bu $fillablebeyaz listeye saygı duymuyor, bu nedenle _token ve veritabanında alan olmayan bir şey eklemeye çalışırken hatalarla karşılaşıyorsunuz, istediğiniz şeyleri ayarlıyorsunuz filtre, vb. Bu beni dışarı serseri, çünkü toplu atama kullanmak ve genel mümkünse daha az kod yazmak istiyorum. Neyse ki Eloquent'in createyöntemi sadece kaydetme yöntemini (yukarıda @xdazz'da belirtilen) sarar, böylece son oluşturulan kimliği yine de çekebilirsiniz ...

public function store() {

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

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

2
Bu örnek 5.1'de benim için işe yaramadı, ancak bu işe yaradı:$new = Company::create($input); return redirect('company/'.$new->id);
timgavin

2
Bu, istek alanları adının ilgili veritabanı sütunlarıyla aynı olduğunu varsayar. Bu her zaman geçerli değildir (örneğin eski kodlar) ..
mosid

48

Tablonun otomatik olarak artan bir kimliği varsa, bir kayıt eklemek ve sonra kimliği almak için insertGetId yöntemini kullanın:

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

Bakınız: https://laravel.com/docs/5.1/queries#inserts


Açıkladığınız şey Fluent kullanarak son eki yakalamak gibi görünüyor. Soru Eloquent hakkındaydı. Daha çok benzeyecekti: $ id = Model :: create ('vote' => 0]) -> id; Yukarıdaki yanıtta açıklandığı gibi: stackoverflow.com/a/21084888/436443
Jeffz

46

**** Laravel için ****

Önce bir nesne oluşturun, sonra o nesne için öznitelik değerini ayarlayın, daha sonra nesne kaydını kaydedin ve son eklenen kimliği alın. gibi

$user = new User();        

$user->name = 'John';  

$user->save();

// Şimdi Son eklenen kimliği alıyorum

$insertedId = $user->id;

echo $insertedId ;

16

Laravel 5'te: Bunu yapabilirsiniz:

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

İşte bir örnek:

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

Bu benim için Lara 4.2'de çalıştı

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

11

Laravel 4'te son eklenen kimliği nasıl bulacağımız aşağıda açıklanmıştır

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

Aynı anda insertGetIdtakmak ve takmak için kullanınid

Gönderen doc

Tablonun otomatik olarak artan bir kimliği varsa, bir kayıt eklemek ve sonra kimliği almak için insertGetId yöntemini kullanın:

Tarafından Model

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

Tarafından DB

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

Daha fazla ayrıntı için: https://laravel.com/docs/5.5/queries#inserts


6

Modeli kaydettikten sonra, başlatılan örnek kimliğine sahiptir:

$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

İçin ekin ()

Misal:

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

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

3

Laravel 5.2'de mümkün olduğunca temiz yapardım:

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

3

Sonra

$data->save()

$data->id size eklenen kimliği verecektir,

Not: sizin autoincrement sütun adı ise sno ardından kullanmak gerekir $data->snodeğil$data->id


2

Sonra tasarrufu veritabanında bir kayıt, erişebileceğiniz id tarafından$data->id

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

2

Laravel için, yeni bir kayıt ekleyip çağırırsanız $data->save()bu işlev bir INSERT sorgusu yürütür ve birincil anahtar değerini (yani id varsayılan olarak ).

Aşağıdaki kodu kullanabilirsiniz:

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

Bunu yapabilirsiniz:

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

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

1

Veritabanına son eklenen kimliği almak için

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

burada $ lastInsertedId size en son eklenen otomatik artış kimliğini verir.


1

En kısa yol muhtemelen refresh()modeldeki bir çağrıdır :

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

1

Bu soru biraz tarihli olmasına rağmen. Hızlı ve kirli çözümüm şöyle görünecektir:

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

Ama sanırım çok sık karşılaşılan veritabanlarındaki yarış koşullarına karşı savunmasız.


1
Teşekkürler! Bunu benim boru hattımda kullanabilirdim. Yani yarış koşulları ve güzel kod hakkında endişelenmeyin.
Daantje

1

Ayrıca şunu da deneyebilirsiniz:

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

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

0

Eloquent Model Kullanımı

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

Sorgu Oluşturucu'yu kullanma

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

0

Kaydettikten Sonra $data->save(). tüm veriler içeri aktarılır $data. Bu bir nesne olduğundan ve geçerli satır yakın zamanda içine kaydedilir $data. böylece son insertIdiçeride bulunur $data->id.

Yanıt kodu:

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


0

Save yöntemini çağırdığınız nesne ile en son eklenen kimliği alabilirsiniz;

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

Böylece şunları yazabilirsiniz:

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

0

Son eklenen kayıt kimliğini kolayca getirebilirsiniz

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

DB'ye son eklenen kayıttan Id almak için harika bir numara.


iki eşzamanlı kullanıcı aynı anda şirket modeline eklenir. zamanlama doğruysa 1. gönderi 2. kimliği alabilir, bu güvenilir değildir. kabul edilen cevap güvenilirdir.
Alex

@Alex lütfen kontrol edin, bu çalışıyor ve kayıtlardan son eklenen kimliği almak için en iyi çözüm.
Priyanka Patel

güncellenmiş çözüm iyidir, ancak kabul edilen yanıttan daha fazla kod gerektirir. $user->idEklenen kimliği almak için oluşturduktan sonra basitçe yapmak yeterlidir.
Alex

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

2
Bu gönderi 3 yıl önce cevaplandı. Kullanıcıya neden yardımcı olabileceği veya OP'nin sorusunu daha iyi bir şekilde nasıl çözebileceği konusunda daha fazla açıklama eklemek için lütfen yanıtınızı düzenleyin.
Syfer

1
Anında yardım sağlayabilecek bu kod snippet'i için teşekkür ederiz. Düzgün bir açıklama , bunun neden problem için iyi bir çözüm olduğunu göstererek eğitim değerini büyük ölçüde artıracak ve benzer, ancak aynı olmayan soruları olan gelecekteki okuyucular için daha yararlı hale getirecektir. Lütfen açıklama eklemek için cevabınızı düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğunu belirtin. Sorunun yaşı ve cevabınızın düşük kalitesinden bahsetmiyorum bile.
GrumpyCrouton

-1

Eloquent Model Kullanımı

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;

}

Sorgu Oluşturucu'yu kullanma

$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'de Son Eklenen Satır kimliğini almanın daha fazla yöntemi için: http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel


-1

Sen kullanabilirsiniz $thisakım fonksiyonu ya da kontrolöre (herhangi bir ekstra sütun eklemeden) "laravel anlamlı Kullanarak Son Eklenen Id" elde etmek yapıcı değişkeni.

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

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.