Может красноречиво игнорировать ненужные данные в Laravel 5.7

По сути, это тот же вопрос, что и здесь от 2013 года. За исключением того, что ответ не работает для меня.

У меня есть модель App\Post:

 class Post extends Model
 {
   protected $fillable = ['title'];
   // This Model doesn't contain an 'authorname' field
   public function author()
   {
     return $this->belongsTo('App\Author');
   }
 }

и модель приложения\автор:

 class Author extends Model
 {
   protected $fillable = ['name'];

   public function posts()
   {
     return $this->hasMany('App\Post');
   }
 }

И массив, который я хочу сохранить в этой модели:

$posts = [
   ['title'=>'one post', 'authorname' => 'Mickey'],
   ['title'=>'another post', 'authorname' => 'Minny'],
];

foreach($posts as $post){
   $authorModel=App\Author::firstOrCreate(['name'=>$post['authorname']]);
   App\Post::create($post)->author()->associate($authorModel)->save();
}

Согласно этому вопросу, это должно работать, но я получаю ан

Ошибка SQL 42522: столбец не найден: 1054 Неизвестный столбец «имя автора» в «списке полей»

что предполагает, что Laravel перенаправляет весь массив в mySQL. Есть ли способ заставить это работать, не сбрасывая ключ имени автора?

Очевидно, что это упрощенная версия того, что я хочу сделать, и отслеживание того, что сбрасывать, кажется ненужным, как и назначение всех ключей массива соответствующим полям базы данных вручную.


person Johanness    schedule 11.12.2018    source источник
comment
Пожалуйста, опубликуйте все сообщение об ошибке с выполненным запросом.   -  person Jonas Staudenmeir    schedule 11.12.2018
comment
Вы зацикливаетесь на $post, верно? $post['authorname'] так бы не работал.   -  person Jonas Staudenmeir    schedule 11.12.2018
comment
Виноват. Вырезать слишком много. Исправлено...   -  person Johanness    schedule 11.12.2018
comment
@Jonas Staudenmeir: Вся ошибка, которую я получаю: In Connection.php line 664: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'authorname' in 'field list' (SQL: insert into 'posts' ('name', 'authorname', 'updat ed_at', 'created_at') values (Frau Meier, die Amsel, Kathrin Leuenberger, 2018-12-11 16:05:28, 2018-12-11 16:05:28)) In Connection.php line 452: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'authorname' in 'field list'   -  person Johanness    schedule 11.12.2018
comment
Ваша таблица posts содержит столбец authorname? Потому что у вас есть: App\Post::create($post) где переменная $post имеет это поле...   -  person Kamil Kiełczewski    schedule 11.12.2018
comment
нет. Это именно тот вопрос: может ли Eloquent игнорировать нерелевантные данные.   -  person Johanness    schedule 11.12.2018
comment
Вы переопределяете $guarded в модели Post? Используете ли вы дополнительные пакеты? Каков результат dd((new Post($post))->getAttributes());?   -  person Jonas Staudenmeir    schedule 11.12.2018


Ответы (1)


Единственная идея, которая у меня есть, заключается в том, что вы запускаете этот код в DatabaseSeeder (который автоматически снимает защиту моделей) или где-то вручную вызываете Eloquent::unguard() (или код, подобный этому). Это объясняет, почему любые другие поля используются при создании модели независимо от свойства $fillable.

person Marcin Nabiałek    schedule 11.12.2018
comment
Мой (откуда-то скопированный) код сидера был окружен unguard//guard the models. Чтобы проверить, была ли проблема в этом, я закомментировал их — не понял, сиды по умолчанию не защищаются. - person Johanness; 12.12.2018
comment
это также делает заполняемую модель звездочкой, как насчет того, чтобы игнорировать неизвестный столбец при сохранении - person david valentino; 15.10.2020