我试图在现有记录上调用Eloquent的save()方法,但是从Illuminate的查询生成器中收到错误。
按照Laravel网站http://laravel.com/docs/eloquent#insert-update-delete上的文档更新检索到的模型,并查看此处的示例:Laravel Eloquent ORM save: update vs create,我的代码似乎遵循预期的约定,但是相反,我得到了这篇文章标题中提到的错误。
$this->employee = Employee::where('login', $login);
$this->employee->first_name = 'John';
$this->employee->last_name = 'Doe';
$this->employee->save();
Employee类扩展了Eloquent,如果我创建了一个新的模型实例,然后设置了一些属性然后调用save()方法,它就可以很好地执行insert语句。我错过了什么?
答案 0 :(得分:34)
显然,->get()
方法不适用于Eloquent的->save()
方法,您必须使用->first()
。
<强>正确:强>
$this->employee = Employee::where('login', $login)->first();
<强>不正确:强>
$this->employee = Employee::where('login', $login)->get();
答案 1 :(得分:10)
你必须在给出 - &gt; where
后获取你的模型$this->employee = Employee::where('login', $login)->get();
或
$this->employee = Employee::where('login', $login)->first();
如果您不这样做,您的对象$ this-&gt;员工将不会是一个而您无法使用 - &gt; save()
答案 2 :(得分:0)
也许更多细节可以更好地理解
使用您的员工模型:
如果你做
Employee::find(1)
这将返回一个雄辩的模型对象(Employee Class的实例)
如果你做
Employee::where('field',op,value)
这将返回一个Builder对象(Laravel Builder类的实例)
如果你做
Employee::where('field',op,value)->get()
这将返回对象的集合(Employee实例的列表)
如果你做
Employee::where('field',op,value)->first()
此first()执行get()函数,然后返回集合的第一个元素。
Laravel模型扩展了Model类,并且在这个Model类中是save()函数。为了能够调用它,您必须拥有模型的实例,而不是其他实例。
RM:请注意first()函数,如果返回了2个元素,则此结果的行为就像只有一个结果而并非如此。在您的情况下,登录名在数据库中被声明为唯一,因此应该不成问题,但请注意其他情况。