Php 在Laravel中刷新模型时如何选择字段

Php 在Laravel中刷新模型时如何选择字段,php,laravel,Php,Laravel,您可能知道,我们可以对模型实例使用refresh方法,以便从数据库中刷新它 刷新完全从数据库重新加载所有列refresh方法似乎不接受任何输入,所以我想知道是否有方法从数据库中刷新某些字段 为了演示,让我们创建一个伪模型,如下所示: Foo --- bar: char baz: char 我有一个名为$Foo的Foo的实例$foo->refresh()同时获取$foo->bar和$foo->baz。如何仅获取/刷新栏字段 提前谢谢 环境 PHP7.4.5 拉维7.x 我认为没有办法这样做。

您可能知道,我们可以对模型实例使用
refresh
方法,以便从数据库中刷新它

刷新完全从数据库重新加载所有列
refresh
方法似乎不接受任何输入,所以我想知道是否有方法从数据库中刷新某些字段

为了演示,让我们创建一个伪模型,如下所示:

Foo
---
bar: char
baz: char
我有一个名为
$Foo
Foo的实例
$foo->refresh()
同时获取
$foo->bar
$foo->baz
。如何仅获取/刷新
字段

提前谢谢


环境
  • PHP7.4.5
  • 拉维7.x

    • 我认为没有办法这样做。最好的选择是获取
      $foo
      对象的主键,并查询所需字段:

      $id=$foo->id;
      $refreshed=Foo::select('bar')->where('id','=',$id)->first();
      $foo->bar=$refreshed->bar;
      
      但是,这将取消模型与数据库的同步。另一个选项是在模型中创建自定义方法,该方法以更抽象的方式执行,并检索新的未同步对象:

      //在您的模型中:
      公共函数刷新字段(字符串$field)
      {
      $this->$field=(新的static())
      ->选择($field)
      ->其中($this->key(),'=',$this->{$this->key()})
      ->第一个()->$字段;
      退还$this;
      }
      //然后在外面:
      $foo=foo::first();
      //执行操作。
      $foo->refreshField('bar');
      
      同样,请记住,这将使您的模型与数据库不同步。此外,这是一个POC,我没有测试它,但总体思路应该是可行的。如果您创建了一个父模型并从中扩展了所有其他模型(从Eloquent扩展而来),那么这应该适用于您的任何模型

      对于更完整的版本,您可以传递数组而不是字符串,并检索要刷新的所有字段,然后在循环中分配它们:

      公共函数refresFields(字符串…$fields)
      {
      $fields=$this->$field=(新的static())
      ->选择($fields)
      ->其中($this->key(),'=',$this->{$this->key()})
      ->第一个();
      foreach($fields作为$field){
      $this->$field=$field;
      }
      退还$this;
      }
      

      我不推荐这个,但如果你真的需要,试试看。祝您好运

      对于这种情况,您需要刷新(
?@MrEduar For)。更具体地说,Laravel似乎不会加载
storedAs
列,因为它们是在插入后在数据库中生成的。在MariaDB生成存储列后刷新不会导致数百次插入的死亡,但如果有更多的插入呢?这将使查询加倍,从而使性能降低两倍。只选择一列进行刷新/刷新会更有效。