【问题标题】:Laravel 5 - Updating associated models using push()Laravel 5 - 使用 push() 更新关联模型
【发布时间】:2014-12-17 17:16:17
【问题描述】:

我正在尝试这样做:

$volunteer = Volunteer::with('user')->find($id);

$input = $updateVolunteerRequest->all();

$volunteer->fill($this->fillFields($input));

$volunteer->user->fill([
    'email' => $input['email']
]);

$volunteer->push();

push() 方法似乎不起作用。

它会抛出以下错误:

FatalErrorException in Model.php line 1463:
Call to a member function push() on a non-object
It worked in Laravel 4. Is there a new way of doing this in version 5? Or am I doing something wrong.

我检查了$volunteer,它返回了模型。

【问题讨论】:

  • 您可能会发现以下答案很有用:stackoverflow.com/questions/24303003/…
  • 填充方法在我的情况下有效
  • @aBhijit 我已经更新了我的答案,其中包含指向我刚刚提交的拉取请求的链接以更正问题。我不知道它是否会被接受,但您可以查看它以了解当前的解决方案或了解更多信息。
  • @aBhijit 我的 pull request 被合并进来了,所以如果你将 Laravel 更新到最新版本,这个问题应该会得到解决。

标签: php laravel laravel-5 eloquent model-associations


【解决方案1】:

push 方法循环遍历模型上所有加载的关系,并在它们上调用push。因此,失败的不是 $volunteer 上的 push,而是相关模型上的 push 失败。

在 Laravel 4 中,push 具有以下代码:

foreach ($this->relations as $models)
{
    foreach (Collection::make($models) as $model)
    {
        if ( ! $model->push()) return false;
    }
}

在此代码中,如果关系返回 NULL,则不会出现错误。 Collection::make(NULL) 返回一个空数组,因此 foreach 永远不会执行。然而,在 Laravel 5 中,push 有这样的代码:

foreach ($this->relations as $models)
{
    $models = is_array($models) ? $models : array($models);

    foreach ($models as $model)
    {
        if ( ! $model->push()) return false;
    }
}

在这种情况下,如果关系为空,则会出现错误,因为array(NULL) 返回一个包含一个条目的数组:NULL 值。因此,foreach 循环将执行,它会尝试在 NULL 值上调用 push,从而导致您的 Call to a member function push() on a non-object 错误。

所以,看起来这是 Laravel 5 中的一个错误。

编辑

看起来push() 方法已更新,因为对 Collection 对象进行了更新。我已经提交了一个拉取请求来纠正这个问题。您可以查看拉取请求 here,其中还包含指向报告的问题和其他背景信息的链接。

编辑 2

我的拉取请求已合并,因此您应该能够将 Laravel 5 更新到最新版本,并且应该更正该问题。

【讨论】:

    猜你喜欢
    • 2017-03-16
    • 2015-07-30
    • 2017-02-20
    • 2015-02-27
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多