laravel 5.4 вставить игнорировать в last_insert_id [duplicate]

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

201
задан SoldierCorp 22 July 2015 в 09:04
поделиться

18 ответов

После save, $data->id должен быть вставлен последний id.

return Response::json(array('success' => true, 'last_insert_id' => $data->id), 200);
278
ответ дан xdazz 20 August 2018 в 06:48
поделиться
  • 1
    Объект всегда возвращает объект, ofc. Это единственный путь. – Cas Bloem 26 November 2014 в 15:11
  • 2
    Помните, что если id не автоинкремент, это всегда будет возвращать 0. В моем случае идентификатор был строкой (UUID), и для этого мне пришлось добавить public $incrementing = false; в мою модель. – Luís Cruz 20 April 2015 в 17:18
  • 3
    @milz У меня есть триггер MySQL, который генерирует uuid для настраиваемого поля с именем aid, и я установил $incrementing = false;, но он тоже не возвращается! – SaidbakR 8 April 2017 в 13:29

После того, как

$data->save()

$data->id предоставит вам вставленный id,

Примечание: Если ваше имя столбца автоинкремента является sno, тогда вы должны использовать $data->sno, а не $data->id

2
ответ дан Abhishek Goel 20 August 2018 в 06:48
поделиться

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

Вы можете использовать следующий код:

if($data->save()) {
    return Response::json(array('status' => 1, 'primary_id'=>$data->id), 200);
}
2
ответ дан Andrew Elliott 20 August 2018 в 06:48
поделиться

После сохранения $data->save(). все данные вставляются внутри $data. Поскольку это объект, и текущая строка недавно сохраняется только внутри $data. поэтому последний insertId будет найден внутри $data->id.

Код ответа будет:

return Response::json(array('success' => true, 'last_insert_id' => $data->id), 200);
30
ответ дан Barry 20 August 2018 в 06:48
поделиться
  • 1
    То, что вы описали, похоже на захват последней вставки с использованием Fluent. Вопрос был о Красноречии. Это будет выглядеть больше: $ id = Model :: create ('votes' = & gt; 0]) - & gt; id; Как описано в этом ответе выше: stackoverflow.com/a/21084888/436443 – Jeffz 10 July 2018 в 22:02

В Laravel 5.2 я сделал бы это как можно более чистым:

public function saveContact(Request $request, Contact $contact)
{
   $create = $contact->create($request->all());
   return response()->json($create->id,  201);
}
2
ответ дан bobbybackblech 20 August 2018 в 06:48
поделиться

Используйте insertGetId для вставки и вставления id одновременно

Из doc

Если таблица имеет auto-incrementing 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

7
ответ дан C2486 20 August 2018 в 06:48
поделиться

xdazz прав в этом случае, но для будущих посетителей, которые могут использовать DB::statement или DB::insert, существует другой способ:

DB::getPdo()->lastInsertId();
76
ответ дан Community 20 August 2018 в 06:48
поделиться
  • 1
    На самом деле вы можете сделать это правильно во вставке $id = DB::table('someTable')->insertGetId( ['field' => Input['data']); – Casey 15 May 2014 в 16:05
  • 2
    @Casey делает это таким образом, не будет обновлять временные метки в БД – Rafael 7 December 2014 в 05:30
  • 3
    @Rafael, если вы хотите обновить timestamps с помощью insertGetId, любезно проверьте здесь – Frank Myat Thu 3 May 2016 в 07:54
  • 4
    Именно то, что я искал на днях! Кроме того, insertGetId работает только в том случае, если столбцы id действительно называются «id». – Captain Hypertext 17 December 2016 в 02:42
  • 5
    – Bhavin Thummar 28 August 2018 в 07:29

Для тех, кому также нравится, как Джеффри Пут использует Model::create() в своих учебниках Laracasts 5, где он просто отправляет запрос прямо в базу данных, не указывая явно каждое поле в контроллере и используя $fillable модели для массового присвоения (очень важно, для кого-то нового и использующего этот путь): я читал много людей, использующих insertGetId(), но, к сожалению, это не соответствует белым спискам $fillable, поэтому вы получите ошибки с ним, пытаясь вставить _token и все, что isn 't поле в базе данных, в конечном итоге установите то, что вы хотите фильтровать, и т. д. Это вытолкнуло меня, потому что я хочу использовать массовое назначение и в целом писать меньше кода, когда это возможно. К счастью, метод create Eloquent просто обертывает метод сохранения (то, что указано выше @xdazz), поэтому вы можете потянуть последний созданный ID ...

public function store() {

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

    return redirect('company/'.$id);
}
37
ответ дан dave 20 August 2018 в 06:48
поделиться
  • 1
    Этот пример не работал для меня в 5.1, но это произошло: $new = Company::create($input); return redirect('company/'.$new->id); – timgavin 19 September 2015 в 18:15
  • 2
    Это предполагает, что имя поля запроса совпадает с их соответствующими столбцами базы данных. Это не всегда так (например, устаревшие коды). – mosid 30 November 2017 в 05:47

Использование 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;

}

Использование 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;

Для получения дополнительных методов для получения последнего введенного идентификатора строки в Laravel: http: // phpnotebook. ком / 95-Laravel / 127-3-метода к-получить последний вставлен-строка-идентификатор-в-Laravel

-1
ответ дан Karthik 20 August 2018 в 06:48
поделиться

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

Сначала создайте объект, затем установите значение атрибута для этого объекта, затем сохраните запись объекта и затем получите последний вставленный идентификатор. таких как

$user = new User();        

$user->name = 'John';  

$user->save();

// Теперь Получение последнего вставленного id

$insertedId = $user->id;

echo $insertedId ;
26
ответ дан Majbah Habib 20 August 2018 в 06:48
поделиться

Вы можете сделать это:

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

$lastInsertId=app('db')->getPdo()->lastInsertId();
1
ответ дан Moody_Mudskipper 20 August 2018 в 06:48
поделиться

В 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;
    }
}
12
ответ дан Mujibur 20 August 2018 в 06:48
поделиться

Для получения последнего вставленного id в базе данных Вы можете использовать

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

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

0
ответ дан PPL 20 August 2018 в 06:48
поделиться

Вот как мы можем получить последний вставленный id в 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.');
    }
9
ответ дан Qamar Uzman 20 August 2018 в 06:48
поделиться
public function store( UserStoreRequest $request ) {
    $input = $request->all();
    $user = User::create($input);
    $userId=$user->id 
}
0
ответ дан Shadow 20 August 2018 в 06:48
поделиться

Использование Eloquent Model

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

Использование Query Builder

$lastId = DB::table('reports')->insertGetId(['email' => 'johndoe@example.com']);
0
ответ дан srmilon 20 August 2018 в 06:48
поделиться

После сохранения записи в базе данных вы можете получить доступ к id с помощью $data->id

return Response::json(['success' => true, 'last_insert_id' => $data->id], 200)
2
ответ дан Tayyab_Hussain 20 August 2018 в 06:48
поделиться
33
ответ дан Barry 31 October 2018 в 06:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: