Полиморфное отношение Laravel 5.8 `nullableMorphs` не работает

У меня есть таблица для вложений, которая имеет полиморфную связь с другими таблицами. Я хочу загрузить файл при выборе файла и вставить его вattachments table, но эта запись не связана ни с одной родительской таблицей, пока не будет создана родительская запись, поэтому для этих двух полей attachable_id, а также attachable_typeдолжно допускать значение NULL. Ниже приведена миграция таблицы вложений:

schema::table('attachments', function (Blueprint $table) {
  $table->nullableMorphs('attachable');
});

Но когда я создаю запись вложения, появляется ошибка.

$attachment = new Attachment();
$attachment->name = 'name';
.........
.........
$attachment->save();

"message": "SQLSTATE[HY000]: General error: 1364 Field 'attachable_id' doesn't have a default value

3 ответа

Форма Laravel GitHub вопросы:

Это просто помощник для самого простого случая определения столбцов идентификатора морфинга и типа морфинга. Если вам нужно больше контроля, их можно назначить индивидуально.

Лучше делать это вручную,

$table->unsignedInteger('attachable_id')->nullable();
$table->string('attachable_type')->nullable();

Использовать attachable_id в заполняемом массиве в Attachment модель.

class Attachment extends Model
{
    protected $fillable = ['attachable_id'];
}

Примечание: убедитесь, что в таблице attachable_id допускает значение NULL.

Вам нужно будет указать fillable атрибут на модели

class Attachment extends Model
{
      //only the field names inside the array can be mass-assign
      protected $fillable = ['attachable_id']; 
}

Подробнее: Что означает "массовое назначение" в Laravel ( ссылка)


При миграции вы можете сделать это, чтобы сделать столбец допускающим значение NULL:

public function up()
{
    Schema::create('tablename', function (Blueprint $table) {
        $table->increments('attachable_id')->nullable();
    });
}

->nullable()Укажите, что столбец допускает значения NULL ( ссылка)

Другие вопросы по тегам