从2013年开始,这基本上是与this相同的问题。除了答案对我不起作用。
我有一个Model 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();
}
根据this问题,这应该可以,但是我得到了
SQL错误42522:找不到列:1054“字段列表”中的未知列“ authorname”
这表明Laravel将整个数组转发到mySQL。有没有一种方法可以在不重置authorname密钥的情况下进行这项工作?
显然,这是我想要做的简化版本,并且跟踪未设置的内容似乎是不必要的-就像将所有数组键手动分配给它们各自的数据库字段一样。
答案 0 :(得分:1)
我在这里唯一的想法是,您在DatabaseSeeder中运行此代码(该代码自动使模型不受保护),或者您在某个地方手动调用Eloquent::unguard()
(或与此类似的代码)。这将解释为什么无论$fillable
属性如何,在创建模型时都使用其他任何字段。