laravel красноречиво создает новую запись без повторения нового ключевого слова перед методом сохранения()

#php #laravel #eloquent

Вопрос:

Я написал этот код в Laravel:

     $setting = new Setting;
    $setting->name = 'name1';
    $setting->save();
    
    $setting->name = 'name2';
    $setting->save();
 

после выполнения я вижу только name2 в базе
данных, но после выполнения этого кода:

     $setting = new Setting;
    $setting->name = 'name1';
    $setting->save();
    $setting = new Setting;
    $setting->name = 'name2';
    $setting->save();
 

обе записи сохранены правильно, поэтому у меня есть name1 и name2 .

Я не могу понять, почему $setting так важно переназначить переменную с $setting = new Setting; помощью?

вопрос в том $setting object of Setting , почему мы должны переназначить его снова? как это помогает?

как это работает? почему первый отрезанный не работает?

например, в этом фрагменте PHP:

 <?php 
class Foo{
    public $name;
    public function bar(){
        echo $this->name;
    }
}
$obj1 = new Foo;
$obj1->name = 'object_one';
$obj1->bar();
//////$obj1 = new Foo;// we don't need this line in this snippet 
$obj1->name = 'object_two';
$obj1->bar();
var_dump($obj1); // answer is object(Foo)#1
 

Похоже, Ларавель работает с object unique id этим … где находится соответствующий код в Laravel? где Laravel проверяет идентификатор объекта, чтобы понять, что он должен запускать create или update метод?

Комментарии:

1. Это важно, потому что без переназначения $setting = new Setting вы изменяете одну и ту же запись , а не создаете новую. Обратите внимание на new ключевое слово.

Ответ №1:

Вы могли бы использовать create() , если у вас есть 'name' внутри Setting $fillable собственности.

 Setting::create(['name' => 'name1']);
Setting::create(['name' => 'name2']);
 

Причина, по которой вам нужно переназначить его в своем коде, заключается в том, что $setting он привязан к Setting модели. Если вы не переназначите его, то любая выполняемая вами операция приведет к обновлению вместо вставки нового параметра.

Вот таблица для иллюстрации:

код $setting
 $setting = new Setting; 
 Setting#1{} 
 $setting->name = 'name1'; 
 Setting#1{
   name: 'name1'
} 
 $setting->save(); 
 Setting#1{
   id: 1
   name: 'name1'
   created_at: '2021-03-19 20:00:00'
   updated_at: '2021-03-19 20:00:00'
} 
 $setting->name = 'name2'; 
 Setting#1{
   id: 1
   name: 'name2'
   created_at: '2021-03-19 20:00:00'
   updated_at: '2021-03-19 20:00:00'
} 
 $setting->save(); 
 Setting#1{
   id: 1
   name: 'name2'
   created_at: '2021-03-19 20:00:00'
   updated_at: '2021-03-19 20:00:05'
} 
 $setting = new Setting; 
 Setting#2{} 
 $setting->name = 'name3'; 
 Setting#2{
   name: 'name3'
} 
 $setting->save(); 
 Setting#2{
   id: 2
   name: 'name3'
   created_at: '2021-03-19 20:00:20'
   updated_at: '2021-03-19 20:00:20'
}