Laravel Eloquent를 사용하여 마지막으로 삽입 한 ID 가져 오기


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

마지막으로 삽입 한 ID를 반환하고 싶지만 얻는 방법을 모르겠습니다.

친절하다!

답변:


378

저장 , $data->id마지막 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
ID가 자동 증가하지 않으면 항상을 반환 0합니다. 필자의 경우 ID는 문자열 (UUID)이었고 이것이 작동하려면 public $incrementing = false;모델 에 추가해야 했습니다.
Luís Cruz

2
@ milz 이름이 지정된 사용자 정의 필드에 대한 uuid를 생성하는 MySQL 트리거가 aid있으며 설정 $incrementing = false;했지만 반환되지 않습니다!
SaidbakR

@SaidbakR이 사실이지만, 매우 중요한 정보를 얻은 Laravel 문서 섹션을 표시 할 수 있습니까?
Damilola Olowookere

@DamilolaOlowookere 이것은 Laravel 5.4를 사용하는 응용 프로그램에서 찾은 것입니다.
SaidbakR

121

xdazz는 이 경우 권리이지만, 사용하고있는 미래 방문자의 이익을 위해 DB::statement또는 DB::insert다른 방법이있다 :

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

43
실제로 삽입물에서 바로 할 수 있습니다$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
Casey

1
@Casey는 이런 식으로 DB에서 타임 스탬프를 업데이트하지 않습니다
Rafael

@Rafael,을 사용 timestamps하여 업데이트 insertGetId하려면 여기를
Frank Myat Thu

내가 다른 날에 정확히 찾고 있었던 것! 또한 insertGetIdid 열이 실제로 "id"라고하는 경우에만 작동합니다.
Captain Hypertext

@Benubird, 귀하의 답변에 따라 해결책을 얻었습니다.
Bhavin Thummar

57

Jeffrey Way가 Model::create()Laracasts 5 튜토리얼에서 사용하는 방법을 좋아하는 사람 은 컨트롤러의 각 필드를 명시 적으로 설정하지 않고 $fillable대량 할당을 위해 모델을 사용하지 않고 (새로운 사람과 사용하는 사람에게 매우 중요) 이 방법) : 나는 많은 사람들을 사용 insertGetId()하지만 불행히도 이것은 $fillable화이트리스트를 존중하지 않으므로 _token 및 데이터베이스에 필드가 아닌 것을 삽입하려고하면 오류가 발생하여 원하는 것을 설정합니다. 필터 등. 대량 할당을 사용하고 가능한 경우 코드를 적게 작성하기 때문에 저를 놀라게했습니다. 다행히 Eloquent의 create메소드 는 save 메소드 (@xdazz가 위에서 인용 한 것)를 래핑하므로 마지막으로 생성 된 ID를 계속 가져올 수 있습니다.

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

테이블에 자동 증가 ID가있는 경우 insertGetId 메소드를 사용하여 레코드를 삽입 한 후 ID를 검색하십시오.

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

참조 : https://laravel.com/docs/5.1/queries#inserts


Fluent를 사용하여 마지막 인서트를 캡처하는 것처럼 설명했습니다. 질문은 Eloquent에 관한 것입니다. 다음과 같이 보일 것입니다 : $ id = Model :: create ( 'votes'=> 0])-> id; 위의 답변에서 설명한 바와 같이 : stackoverflow.com/a/21084888/436443
Jeffz

46

라 라벨

먼저 객체를 만든 다음 해당 객체의 속성 값을 설정 한 다음 객체 레코드를 저장 한 다음 마지막으로 삽입 된 ID를 가져옵니다. 와 같은

$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에서 마지막으로 삽입 된 id를 얻는 방법은 다음과 같습니다.

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동시에

에서 문서

테이블에 자동 증가 ID가있는 경우 insertGetId 메소드를 사용하여 레코드를 삽입 한 후 ID를 검색하십시오.

으로 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

모델을 저장 한 후 초기화 된 인스턴스의 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

대한 삽입 ()

예:

$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

당신은 이것을 할 수 있습니다 :

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

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

1

데이터베이스에서 마지막으로 삽입 된 ID를 얻으려면 다음을 사용할 수 있습니다

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

여기서 $ lastInsertedId는 마지막으로 삽입 된 자동 증분 ID를 제공합니다.


1

가장 짧은 방법은 아마도 refresh()모델을 호출하는 것입니다 .

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

1

이 질문은 약간 날짜가 있지만. 내 빠르고 더러운 솔루션은 다음과 같습니다.

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

그러나 자주 사용되는 데이터베이스의 경쟁 조건에 취약하다고 생각합니다.


1
감사! 파이프 라인에서 사용할 수 있습니다. 따라서 경쟁 조건과 아름다운 코드에 대해 걱정할 필요가 없습니다.
Daantje

1

다음과 같이 시도 할 수도 있습니다.

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

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

0

Eloquent Model 사용

$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

save 메소드를 호출하는 것과 동일한 객체로 마지막으로 삽입 된 id를 얻을 수 있습니다.

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

DB에 마지막으로 삽입 된 레코드에서 ID를 가져 오는 멋진 트릭입니다.


두 명의 동시 사용자가 동시에 회사 모델에 추가합니다. 타이밍이 맞다면 첫 번째 게시물이 두 번째 ID를 얻을 수 있으므로 신뢰할 수 없습니다. 허용 된 답변은 신뢰할 수 있습니다.
Alex

@ 알렉스 친절하게 확인, 이것은 작동하고 레코드에서 마지막으로 삽입 된 ID를 얻는 가장 좋은 솔루션입니다.
Priyanka Patel

업데이트 된 솔루션은 괜찮지 만 허용되는 답변보다 더 많은 코드가 필요합니다. $user->id삽입 된 ID를 얻으려면 만들기 후에 간단하게 충분합니다.
Alex

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

2
이 게시물은 3 년 전에 답변되었습니다. 사용자에게 도움이 될 수있는 이유 또는 도움이 OP의 질문을 더 나은 방법으로 해결하는 방법에 대한 자세한 설명을 추가하려면 답변을 수정하십시오.
Syfer

1
이 코드 스 니펫에 감사드립니다. 즉각적인 도움이 될 수 있습니다. 적절한 설명 왜 이것이 문제에 대한 좋은 해결책인지 보여줌으로써 교육적 가치를 크게 향상시킬 것이며 , 유사하지만 동일하지 않은 질문을 가진 미래 독자들에게 더 유용 할 것입니다. 설명을 추가하기 위해 답을 편집하고 어떤 제한 및 가정이 적용되는지 표시하십시오. 질문의 나이와 답변의 품질은 말할 것도 없습니다.
GrumpyCrouton

-1

Eloquent Model 사용

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에서 Last Inserted Row id를 얻는 더 많은 방법 : http://phpnotebook.com/95-laravel/127-3-methods-to-get-last-inserted-row-id-in-laravel


-1

$this생성자 변수를 사용하여 현재 함수 또는 컨트롤러에서 "Laravel Eloquent를 사용하여 마지막으로 삽입 된 ID"(열을 추가하지 않고)를 달성 할 수 있습니다 .

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

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.