В 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 освободит память, используемую этим объектом, и выделит другую.
После save
, $data->id
должен быть вставлен последний id.
return Response::json(array('success' => true, 'last_insert_id' => $data->id), 200);
После того, как
$data->save()
$data->id
предоставит вам вставленный id,
Примечание: Если ваше имя столбца автоинкремента является sno, тогда вы должны использовать $data->sno
, а не $data->id
Для Laravel, если вы вставляете новую запись и вызываете $data->save()
, эта функция выполняет запрос INSERT и возвращает значение первичного ключа (т.е. id по умолчанию).
Вы можете использовать следующий код:
if($data->save()) {
return Response::json(array('status' => 1, 'primary_id'=>$data->id), 200);
}
После сохранения $data->save()
. все данные вставляются внутри $data
. Поскольку это объект, и текущая строка недавно сохраняется только внутри $data
. поэтому последний insertId
будет найден внутри $data->id
.
Код ответа будет:
return Response::json(array('success' => true, 'last_insert_id' => $data->id), 200);
В Laravel 5.2 я сделал бы это как можно более чистым:
public function saveContact(Request $request, Contact $contact)
{
$create = $contact->create($request->all());
return response()->json($create->id, 201);
}
Используйте 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
xdazz прав в этом случае, но для будущих посетителей, которые могут использовать DB::statement
или DB::insert
, существует другой способ:
DB::getPdo()->lastInsertId();
$id = DB::table('someTable')->insertGetId( ['field' => Input['data']);
– Casey
15 May 2014 в 16:05
timestamps
с помощью insertGetId
, любезно проверьте здесь
– Frank Myat Thu
3 May 2016 в 07:54
insertGetId
работает только в том случае, если столбцы id действительно называются «id».
– Captain Hypertext
17 December 2016 в 02:42
Для тех, кому также нравится, как Джеффри Пут использует 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);
}
$new = Company::create($input);
return redirect('company/'.$new->id);
– timgavin
19 September 2015 в 18:15
Использование 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
**** Для Laravel ****
Сначала создайте объект, затем установите значение атрибута для этого объекта, затем сохраните запись объекта и затем получите последний вставленный идентификатор. таких как
$user = new User();
$user->name = 'John';
$user->save();
// Теперь Получение последнего вставленного id
$insertedId = $user->id;
echo $insertedId ;
Вы можете сделать это:
$result=app('db')->insert("INSERT INTO table...");
$lastInsertId=app('db')->getPdo()->lastInsertId();
В 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;
}
}
Для получения последнего вставленного id в базе данных Вы можете использовать
$data = new YourModelName;
$data->name = 'Some Value';
$data->email = 'abc@mail.com';
$data->save();
$lastInsertedId = $data->id;
здесь $ lastInsertedId даст вам последний добавленный идентификатор автоматического увеличения.
Вот как мы можем получить последний вставленный 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.');
}
public function store( UserStoreRequest $request ) {
$input = $request->all();
$user = User::create($input);
$userId=$user->id
}
Использование 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']);
После сохранения записи в базе данных вы можете получить доступ к id с помощью $data->id
return Response::json(['success' => true, 'last_insert_id' => $data->id], 200)
0
. В моем случае идентификатор был строкой (UUID), и для этого мне пришлось добавитьpublic $incrementing = false;
в мою модель. – Luís Cruz 20 April 2015 в 17:18aid
, и я установил$incrementing = false;
, но он тоже не возвращается! – SaidbakR 8 April 2017 в 13:29