Laravel MassassignmentFirstorNew的id异常

Laravel MassassignmentFirstorNew的id异常,laravel,laravel-5,mass-assignment,Laravel,Laravel 5,Mass Assignment,我试图使用Laravel的firstOrNew方法保存数据,该方法产生MassaSignmentException错误 我不明白为什么firstOrNew方法会触发大规模分配异常,因为它只是查看数据库,而不是试图保存任何内容。发件人: firstOrNew方法(如firstOrCreate)将尝试定位 数据库中与给定属性匹配的记录。然而,如果 找不到模型,将返回新的模型实例。注意 firstOrNew返回的模型尚未持久化到 数据库 那么,为什么我的代码应该抛出MAE: $tour = Tour:

我试图使用Laravel的
firstOrNew
方法保存数据,该方法产生
MassaSignmentException
错误

我不明白为什么
firstOrNew
方法会触发大规模分配异常,因为它只是查看数据库,而不是试图保存任何内容。发件人:

firstOrNew方法(如firstOrCreate)将尝试定位 数据库中与给定属性匹配的记录。然而,如果 找不到模型,将返回新的模型实例。注意 firstOrNew返回的模型尚未持久化到 数据库

那么,为什么我的代码应该抛出MAE:

$tour = Tour::firstOrNew(array('id' => $this->request['id']));
据我所知,上述代码所说的基本上是“查看数据库中是否有一行具有该ID,如果有,则返回该行,如果没有,则创建一个具有相关属性的新对象”。它没有保存任何数据,那么问题是什么


请注意,只有当该行不存在时才会发生错误。

MassAssignmentException在模型中未定义可填充或保护字段时发生

$guarded = [];
$fillable = ['explicitlydefinedfield'];
PS:你已经复制了文本,它准确地描述了正在发生的事情。。。它没有找到记录,正在尝试创建新记录

第一个或新的。。。NEW

使用构造函数创建新模型。方法是批量分配。这就是为什么你会得到一个例外


因此,您需要将
$filleble
数组设置为使用
firstOrNew()

您正在尝试使用ID创建对象。在您的情况下,这可能没问题,但通常ID是自动递增的,因此您不想创建特定的对象。我首先通过另一个属性创建一个对象——如果该名称存在,则抓取它,否则创建一个具有该名称的对象。此外,您还可以考虑查看findOrFail,这听起来更合适——是否存在具有此ID的对象?如果是这样的话,它就会抛出一个例外,尽管
findOrFail
可能不合适,因为根据文档,它会自动发送一个404,这是我不想要的。ID确实是自动递增的,并且是唯一保证唯一的列,这就是我为什么要使用它的原因。我不知道该怎么做……是的,我听到了。Alexey Mezenin的回答涵盖了其失败的所有原因。如果你想要一个轻松的旅程,我敢肯定
$tour=tour::find($this->request['id']);如果(!$tour)$tour=新的tour将是一个真正无痛的方式到达同一个地方。祝你好运是的,这将是一个快速的解决方案。我想除了自动增加ID之外,我还要在我的表中实现一个随机生成的UID列,因为我可以看到这个问题再次出现。谢谢你的帮助。谢谢,我知道设置
保护的
可填充的
属性,我只是不明白当数据没有被“持久化”(即保存)到数据库时为什么它们是必要的。我想下一个答案更好地解决了这个问题:)啊,好的。构造函数使用的fill()方法是Mass assignment。我想这就是关键所在。