调用未定义的方法Illuminate \ Database \ Query \ Builder :: save()

时间:2014-06-03 19:36:15

标签: php laravel-4 eloquent

我试图在现有记录上调用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语句。我错过了什么?

3 个答案:

答案 0 :(得分:34)

显然,->get()方法不适用于Eloquent的->save()方法,您必须使用->first()

<强>正确: $this->employee = Employee::where('login', $login)->first();

<强>不正确: $this->employee = Employee::where('login', $login)->get();

有关其他参考,请参阅http://laravel.io/forum/06-04-2014-symfony-component-debug-exception-fatalerrorexception-call-to-undefined-method-illuminatedatabaseeloquentcollectionsave

答案 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个元素,则此结果的行为就像只有一个结果而并非如此。在您的情况下,登录名在数据库中被声明为唯一,因此应该不成问题,但请注意其他情况。