【问题标题】:Call to undefined method Illuminate\Database\Query\Builder::save()调用未定义的方法 Illuminate\Database\Query\Builder::save()
【发布时间】:2014-06-03 19:36:15
【问题描述】:

我试图在现有记录上调用 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() 方法,它会很好地执行插入语句。我错过了什么?

【问题讨论】:

    标签: php laravel-4 eloquent


    【解决方案1】:

    显然->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

    【讨论】:

    • 这是一个相关的答案吗?
    【解决方案2】:

    你必须在给定 ->where 后获取你的模型

    $this->employee = Employee::where('login', $login)->get();
    

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

    如果你不这样做,你的对象 $this->employee 就不是一个,你就不能使用 ->save()

    【讨论】:

    • 有趣。那行得通。在文档中不清楚,在我链接的其他 stackoverflow 帖子中也不清楚,如果我要遵循 Laravel 文档中的约定(使用 $obj->find(1)),那么似乎 -> get() 方法不是必需的,但它是。感谢您的回复。
    • 好吧,我本来可以在昨晚回家之前发誓,但今天早上再次运行它,现在我得到了Symfony \ Component \ Debug \ Exception \ FatalErrorException Call to undefined method Illuminate\Database\Eloquent\Collection::save() 至少我们终于进入了 Eloquent 命名空间。 :P
    • 您可能有缓存配置或其他内容。使用first() 是要走的路。
    • @Malchesador:你是对的。 ->find(1) 不需要跟随 ->get 或 ->first() 因为它直接使用表的主键作为参数。在这种情况下,结果将是一个具有这些内容行的对象。在 -> 结果集不清楚的情况下,因此您必须获取它...
    【解决方案3】:

    也许更多细节以便更好地理解

    使用您的员工模型:

    如果你做

    Employee::find(1)
    

    这将返回一个 Eloquent 模型对象(员工类的实例)

    如果你做

    Employee::where('field',op,value)
    

    这将返回一个 Builder 对象(Laravel Builder 类的实例)

    如果你做

    Employee::where('field',op,value)->get()
    

    这将返回您的对象的集合(员工实例列表)

    如果你做

    Employee::where('field',op,value)->first()
    

    这个 first() 执行 get() 函数,然后返回集合的第一个元素。

    Laravel 模型扩展了 Model 类,在这个 Model 类中有 save() 函数。所以为了能够调用它,你必须有一个模型实例,而不是别的东西。

    RM :注意 first() 函数,如果返回 2 个元素,则此结果的行为就像只有一个结果并且它不正确。在您的情况下,登录在数据库中被声明为唯一的,因此这应该不是问题,但请注意其他情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 2019-09-29
      • 2020-01-04
      • 2018-10-03
      • 1970-01-01
      • 2019-04-02
      • 2016-11-25
      相关资源
      最近更新 更多