Красноречивый метод создания, возвращающий «id» 0 после сохранения данных

#laravel #eloquent

#laravel #красноречивый

Вопрос:

Я столкнулся со странной проблемой. Это моя миграция:

 Schema::create('calendars', function (Blueprint $table) {
    $table->id();
    $table->string("start");
    $table->string("end");
    $table->foreignId("learner_id")->constrained()->cascadeOnDelete();
    $table->foreignId("driving_instructor_id")->nullable()->constrained()->cascadeOnDelete();
    $table->foreignId("event_type_id")->constrained()->cascadeOnDelete();
    $table->foreignId("licence_class_id")->constrained()->cascadeOnDelete();
    $table->text("description")->nullable();
    $table->timestamps();
});
 

Это моя модель:

 class Calendar extends Model
{
    use SoftDeletes;

    protected $fillable = [
        "id",
        "start",
        "end",
        "learner_id",
        "driving_instructor_id",
        "event_type_id",
        "licence_class_id",
        "description",
    ];

    protected $appends = ["title"];

    public function eventType()
    {
        return $this->belongsTo(EventType::class);
    }

    public function learner()
    {
        return $this->belongsTo(Learner::class);
    }
    public function transaction()
    {
        return $this->hasOne(Transaction::class);
    }

    public function drivingInstructor()
    {
        return $this->belongsTo(DrivingInstructor::class);
    }

    public function licenceClass()
    {
        return $this->belongsTo(LicenceClass::class);
    }

    public function getTitleAttribute()
    {
        return $this->learner->full_name;
    }
}
 

При использовании метода create он успешно создает новую запись в базе данных, однако он возвращает и идентификатор 0.

 $calendarIds[]=(Calendar::create($data))->id;
 

Переменная $data содержит:

 array:12 [
  "title" => ""
  "start" => "2020-11-30T23:00:00.000Z"
  "startTimezone" => ""
  "end" => "2020-11-30T23:00:00.000Z"
  "endTimezone" => ""
  "recurrenceRule" => ""
  "recurrenceException" => ""
  "isAllDay" => true
  "description" => ""
  "driving_instructor_id" => 3
  "event_type_id" => 1
  "licence_class_id" => 1
]
 

Я никогда раньше не сталкивался с этой проблемой. Однако, когда я делаю то же самое с tinker, он возвращает правильный идентификатор. Я также пробовал использовать этот $calendar->save() метод, и он также возвращает идентификатор как 0. Любая помощь будет оценена.

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

1. какую версию Laravel вы используете?

2. Я использую laravel 7

3. что вы получаете от Calendar::first()->id ?

4. Попробуйте удалить id $fillable свойство from в вашей модели

5. @lagbox I действительно дает идентификатор первого сообщения

Ответ №1:

Итак, после долгих поисков в Google я выяснил, что проблема была вызвана Telescope query watcher. Мне пришлось отключить наблюдателя. Вот эта нить https://github.com/laravel/telescope/issues/289

Ответ №2:

Вы должны использовать в сценарии миграции:

 $table->bigIncrements('id');
 

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

1. Сам Laravel использует $table->id(); при миграции пользователей. Я не думаю, что это проблема