@truevolkolak

Laravel 5.8. Почему не работает мутатор?

Здравствуйте!
Есть таблица БД с полем "slug". В миграции:
$table->string('slug');

Так как поле должно быть уникальным и генерироваться автоматически при добавлении новой записи, в модели использую мутатор:
public function setSlugAttribute($value) {
        $this->attributes['slug'] = Str::slug(mb_substr($this->manufacture, 0, 60) . "-", "-");
    }

Метод store в соответствующем контроллере:
public function store(Request $request)
    {
        $manufacture = Manufacture::create($request->all());
        
        return redirect()->route('admin.manufactures.index');
    }

При отправке формы поле 'slug' отправляется пустым и по идее должно до сохранения новой записи быть изменено этим мутатором. Но этого не происходит. Появляется в браузере такая ошибка:
SQLSTATE[HY000]: General error: 1364 Field 'slug' doesn't have a default value 
(SQL: insert into `manufactures` 
(`manufacture`, `description`, `meta_description`, `meta_keywords`, `country`) 
values 
(Производитель 2, описание, meta description, meta keywords, Россия))

Причем, как видно из ошибки, при массовом заполнении даже нет попытки сохранить значение поля 'slug', хотя в модели оно объявлено в массиве $fillable:
protected $fillable = [
        'manufacture',
        'slug',
        'country',
        'image',
        'description',
        'meta_description',
        'meta_keywords',
    ];


P.S. В другом проекте на Laravel 5.7 ровно такой же мутатор отлично работает.
  • Вопрос задан
  • 144 просмотра
Решения вопроса 1
JhaoDa
@JhaoDa
LaravelRUS Team
А почему он должен работать? Мутатор мутирует значение, когда оно устанавливается, явно или неявно.

даже нет попытки сохранить значение поля 'slug', хотя в модели оно объявлено в массиве $fillable
Рекомендую почитать в документации для чего придумано это поле. Уж точно не для извлечения данных из реквеста...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
gzhegow
@gzhegow
Думал, стану умнее, когда адаптируюсь, но нет
Либо ты не передал $_POST['slug'] / $_GET['slug']

Потом ты передаешь в slug $value, а потом его не используешь - берешь $this->manufacture. Он скорее всего пустой, потому что ты новую модель создаешь
1) то есть он попробует SELECT * FROM manufacturers WHERE ... (пустой запрос в базу, если база на 300 пинге в облаке, +350мс на создание страницы)
2) даже если это будет делаться на существующей модели - оно конечно сделает SELECT * и вытянет тебе все поля. Для этого обязательно используют with();

Стоп чо? ты находишься в manufacture.php, там у тебя setSlug() и внутри $this->manufacture.... У тебя связь parent/child внутри этой таблицы? Откуда ты решил взять $this->manufacture?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы