【问题标题】:How do I reload a relation collection in laravel?如何在 laravel 中重新加载关系集合?
【发布时间】:2014-06-15 08:50:15
【问题描述】:

在 laravel 中,使用 attach() 或 detach() 从关系中添加或删除某些内容后,集合没有改变。因此,如果我有一个模型,其 realation 包含[1, 2],则在此之后:

$model->relation()->detach(1);
$model->relation()->attach(3);

它仍将包含[1, 2]!如何刷新?

【问题讨论】:

    标签: php collections laravel laravel-4 relationship


    【解决方案1】:

    $model->fresh() 为我完成了这项工作。 想要复制多层嵌套模型,然后对它们进行循环。 Laravel 正在缓存之前的关系,而不是新的“当前”关系。

    【讨论】:

      【解决方案2】:

      从 Laravel 7.x 开始,您可以使用 $model->refresh() 来刷新模型及其关系。

      Here the docs

      【讨论】:

        【解决方案3】:

        你可以很容易地告诉 laravel 用一个命令来加载一个关系:

        $model->load('relation');
        

        会告诉它刷新关系集合,$model->relation 现在会显示正确的值。

        同样卸载一个关系会是这样的:

        $model->unsetRelation('relation')
        

        【讨论】:

        【解决方案4】:

        要么只是unset 它,让系统按需重新加载。

        unset($model->relation)
        

        $model->unsetRelation('relation');
        

        并让它根据要求加载。

        【讨论】:

          【解决方案5】:

          结论:这里有三个解决方案

          $model->load('relation');
          
          unset($model->relation);
          
          $freshCollection = $user->roles()->get();`
          

          【讨论】:

            【解决方案6】:

            如果您想强制根据需要重新加载所有关系并且您在模型中,您可以使用:

            $this->relations = [];
            

            【讨论】:

            • 这不直观,是不是每次我的关系没有项目时它都会发出数据库请求?
            • 是的,当您执行$user->posts 时,它会检查relations 属性以查看是否已检索到相关集合。如果没有,它会从数据库中加载它。
            【解决方案7】:

            可以使用 Eloquent 查询生成器:

            $freshCollection = $user->roles()->get();
            

            【讨论】:

              猜你喜欢
              • 2015-12-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-01-18
              • 1970-01-01
              • 2018-06-03
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多