Отримайте останній вставлений ідентифікатор, використовуючи красномовний Laravel


294

Зараз я використовую наведений нижче код для вставки даних у таблицю:

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

Я хочу повернути останній вставлений ідентифікатор, але я не знаю, як його отримати.

З повагою!

Відповіді:


378

Після Врятуйте , $data->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);

2
Об'єкт завжди повертає об'єкт, ofc. Це єдиний шлях.
Cas Bloem

40
Будьте уважні, що якщо ідентифікатор НЕ автоматичне збільшення, це завжди повернеться 0. У моєму випадку ідентифікатор був рядком (UUID), і для цього я мав додати public $incrementing = false;у своїй моделі.
Луїс Крус

2
@milz У мене є тригер MySQL, який генерує uuid для користувацького поля з назвою, aidі я встановив, $incrementing = false;але він також не повертається!
SaidbakR

@SaidbakR, хоча це правда, будь ласка, чи можете ви вказати розділ документа Laravel, де ви отримали цю дуже важливу інформацію?
Дамілола Олоуокере

@DamilolaOlowookere Це те, що я знайшов у своїй програмі, яка використовує Laravel 5.4.
SaidbakR

121

xdazz в цьому випадку є правильним, але для користі майбутніх відвідувачів, які можуть використовувати DB::statementабо DB::insert, є інший спосіб:

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

43
Насправді це можна зробити прямо у вкладиші$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
Кейсі

1
@Casey таким чином не оновлюватиме часові позначки в БД
Рафаель

@Rafael, якщо ви хочете оновити timestampsза допомогою insertGetId, будь ласка, перевірте тут
Frank Myat Чт

Саме те, що я шукав днями! Крім того, insertGetIdпрацює лише в тому випадку, якщо стовпці id насправді називаються "id".
Гіпертекст капітана

@Benubird, я отримав своє рішення відповідно до вашої відповіді.
Bhavin Thummar

57

Для тих, кому також подобається, як Джеффрі Вей використовує Model::create()у своїх підручниках Laracasts 5, де він просто надсилає Запит прямо в базу даних, не встановлюючи явно кожне поле в контролері та використовуючи модель $fillableдля масового призначення (дуже важливо, для кожного нового та використання таким чином): я читаю, що багато людей використовують, insertGetId()але, на жаль, це не поважає $fillableбілий список, тому ви отримаєте помилки при спробі вставити _token і все, що не є полем у базі даних, і в кінцевому підсумку налаштуйте речі, які ви хочете фільтр і т. д. Це мене вибило, тому що я хочу використовувати масове призначення і загалом писати менше коду, коли це можливо. На щастя, createметод Eloquent просто обгортає метод збереження (що @xdazz цитував вище), тож ви все одно можете витягнути останній створений ідентифікатор ...

public function store() {

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

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

2
Цей приклад для мене не працював у 5.1, але це було так:$new = Company::create($input); return redirect('company/'.$new->id);
timgavin

2
Це передбачає, що назва полів запиту збігається з відповідними стовпцями бази даних. Що не завжди так (застарілі коди, наприклад) ..
mosid

48

Якщо таблиця має ідентифікатор автоматичного збільшення, використовуйте метод insertGetId, щоб вставити запис, а потім отримати ідентифікатор:

$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; Як описано в цій відповіді вище: stackoverflow.com/a/21084888/436443
Jeffz

46

**** Для Laravel ****

Спочатку створіть об'єкт, потім встановіть значення атрибутів для цього об’єкта, потім збережіть запис об’єкта та отримайте останній вставлений ідентифікатор. як от

$user = new User();        

$user->name = 'John';  

$user->save();

// Тепер отримання останнього вставленого ідентифікатора

$insertedId = $user->id;

echo $insertedId ;

16

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

15

Ось приклад:

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

Це працювало для мене у laravel 4.2

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

11

Ось як ми можемо отримати останній вставлений ідентифікатор у 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

Використовуйте, insertGetIdщоб вставити та вставити idодночасно

Від док

Якщо таблиця має ідентифікатор автоматичного збільшення, використовуйте метод insertGetId, щоб вставити запис, а потім отримати ідентифікатор:

За 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


6

Після збереження моделі ініціалізований екземпляр має ідентифікатор:

$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

Для вставки ()

Приклад:

$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 я зробив би це максимально чистим:

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

3

Після

$data->save()

$data->id дасть вам вставлений ідентифікатор,

Примітка. Якщо назва стовпця для автоматичного збільшення є sno, ви повинні використовувати, $data->snoа не$data->id


2

Після збереження запису в базі даних ви можете отримати доступ до id за допомогою$data->id

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

2

Для Laravel, якщо ви вставляєте нову запис і викликаєте $data->save()цю функцію, виконується INSERT-запит і повертається значення первинного ключа (тобто id за замовчуванням).

Ви можете використовувати наступний код:

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

Для отримання останнього вставленого ідентифікатора в базі даних, який ви можете використовувати

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

тут $ lastInsertedId надає вам останній вставлений ідентифікатор автоматичного збільшення.


1

Найкоротший шлях - це, мабуть, дзвінок refresh()на моделі:

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

1

Хоча це питання трохи датоване. Моє швидке і брудне рішення виглядатиме так:

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

Але я думаю, що він вразливий до перегонів на високочастотних базах даних.


1
Дякую! Це я міг би використовувати у своєму трубопроводі. Тож не турбуйтеся про умови перегонів та гарний код.
Даандже

1

Ви також можете спробувати так:

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

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

0

Використання красномовної моделі

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

Використання програми для запитів

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

0

Після збереження $data->save(). всі дані просуваються всередину $data. Оскільки це об’єкт, а поточний рядок нещодавно зберігається всередині $data. тому останній insertIdбуде знайдений всередині $data->id.

Код відповіді буде:

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


0

Ви можете отримати останній вставлений ідентифікатор з тим самим об'єктом, який ви викликаєте метод збереження;

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

Тож ви можете просто написати:

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

0

Ви можете легко отримати останній вставлений запис Id

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

Це дивовижна хитрість отримати Id з останнього вставленого запису в БД.


двоє одночасних користувачів, що додають до моделі компанії одночасно. це не є надійним, оскільки 1-й пост може отримати ідентифікацію 2-го, якщо термін буде правильним. прийнята відповідь достовірна.
Олексій

@Alex люб'язно перевірте, це працює і найкраще рішення, щоб отримати останній вставлений ідентифікатор із записів.
Приянка Патель

оновлене рішення чудово, однак для нього потрібно більше коду, ніж прийнята відповідь. Просто робимо$user->idДля створення вставленого ідентифікатора достатньо .
Олексій

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

2
На це повідомлення відповіли 3 роки тому. Будь ласка, відредагуйте свою відповідь, щоб додати більше пояснень, чому це може допомогти користувачеві або як це допомагає краще вирішити питання ОП.
Сіфер

1
Дякуємо за цей фрагмент коду, який може надати негайну допомогу. Правильне пояснення значно покращило б його навчальну цінність, показавши, чому це хороше рішення проблеми, і зробило б її кориснішою для майбутніх читачів із подібними, але не однаковими питаннями. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються. Не кажучи вже про вік питання та низьку якість вашої відповіді.
GrumpyCrouton

-1

Використання красномовної моделі

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: http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel


-1

Ви можете використовувати $thisзмінну конструктора, щоб досягти "Останньо введеного ідентифікатора з використанням 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();

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.