【问题标题】:Get Laravel Models with All Attributes获取具有所有属性的 Laravel 模型
【发布时间】:2016-02-04 09:02:26
【问题描述】:

有没有办法在 Laravel 中检索具有所有属性的模型,即使它们为空?它似乎只返回一个属性不为空的模型。

这样做的原因是,如果模型中存在属性,我有一个函数可以从数组中更新模型属性。我使用 property_exists() 函数在设置模型之前检查模型是否具有特定属性。数组键和模型属性应该匹配,所以它是这样工作的。

如果模型已经设置了属性,它就可以正常工作,因为属性存在并从数组中获取值。但是,如果该属性以前为 null,则不会更新或设置任何内容,因为它未通过 property_exists() 检查。

最终发生的是我有一个属性数组,然后可能是两个模型。然后我运行我的 setter 函数,传入属性数组,并在单独的调用中传递每个对象。如果模型有匹配的属性,它会被更新。

【问题讨论】:

    标签: php laravel model eloquent laravel-5.1


    【解决方案1】:

    更新:

    如果您在像这样实例化后尝试这样做:

    $model = new Model;
    

    那么请与 Thomas Kim 的回答不同。

    否则: 您可以在模型实例上使用toArray() 或getArributes() 方法,这将返回所有属性,包括空值。然后你可以使用array_key_exists来查看。

    像这样:

    if (array_key_exists('foo', $model->getAttributes())) {
        $model->foo = 'new value';
    }
    

    【讨论】:

    • 我尝试实例化一个新模型,当尝试其中任何一个函数时,我得到一个空数组。我认为这应该是可以预料的。至少从 getAttributes() 的文档中,它说“获取模型上的所有当前属性。”
    • 您是在项目中实例化的还是只是在修补程序中实例化?
    • 对不起,我没想到要提这个。我确实在我的项目中实例化了它。
    • 对我来说很奇怪它的工作原理。你可以发布你的代码吗?
    【解决方案2】:

    这里有两种方法可以做到这一点。一种方法是在模型中定义默认属性值。

    protected $attributes = ['column1' => null, 'column2' => 2];
    

    然后,您可以使用getAttributes() 方法获取模型的属性。

    如果您不想设置默认属性,我写了一个应该可以工作的快速方法。

    public function getAllAttributes()
    {
        $columns = $this->getFillable();
        // Another option is to get all columns for the table like so:
        // $columns = \Schema::getColumnListing($this->table);
        // but it's safer to just get the fillable fields
    
        $attributes = $this->getAttributes();
    
        foreach ($columns as $column)
        {
            if (!array_key_exists($column, $attributes))
            {
                $attributes[$column] = null;
            }
        }
        return $attributes;
    }
    

    基本上,如果该属性尚未设置,这将在该属性上附加一个空值并将其作为数组返回给您。

    【讨论】:

    • 如果目标是将空值设置为 null,最简单的方法是将 ->nullable() 附加到迁移中的字段。您无需编写新方法或在模型中设置它。话虽如此,这些都不是必需的
    • 目标是让他能够在尚未设置属性时获取所有属性,唯一的方法是将值设置为 null(或其他一些默认值)。
    • 至少,因为我们看不到任何代码,我假设他正在使用一个空实例,因为他说getAttributes() 不起作用。例如,$user = new User; $user->getAttributes(); 之类的内容不会返回属性,因为它没有设置。
    • 啊,如果他打电话给new User;,你确实是对的,在这种情况下我会更新我的答案以与你的不同
    • 谢谢!这使我朝着正确的方向前进。实际上,我不需要模型上的每个属性。只是选择了几个要更新的,巧合的是,当我想到它时,它们也在 $fillable 数组中。所以我实际上可以使用 $fillable 来检查模型是否应该具有该属性。
    【解决方案3】:
    $model->getAttributes();
    

    上面将返回一个原始属性数组(存储在数据库表中)

    $model->toArray() 
    

    以上将返回模型的所有原始、变异(如果使用)和附加属性

    希望对你有帮助!!

    【讨论】:

      【解决方案4】:

      如果您要显式声明所有想要返回的字段会怎样。

      public function getSomeModelFromArray(Request $request)
      {
          // This will only give back the columns/attributes that have data.
          // NULL values will be omitted doing it this way.
          //$model = $request->all();
      
          // However by declaring all the attributes I want I can get back 
          // columns even if the value is null. Additional filtering can be 
          // added on if you still want/need to massage the data.
          $model = $request->all([
              'id',
              'attr1',
              'attr2',
              'attr3',
              //...
          ]);
      
          //...
      
          return $model;
      }
      

      非常通用的示例,但希望有人会觉得这很有用。

      【讨论】:

        【解决方案5】:

        我在我的其他项目中有这个 sn-p 来加载所有模型属性和关系。

        public function forModel($with)
        {
            $this->load($with);
        
            $attributes = $this->toArray();
        
            // Normalize Null Relation To Empty Model
            foreach ($attributes as $key => $value) {
                if (
                    is_null($value) && 
                    method_exists($this, Str::camel($key)) && 
                    $this->{Str::camel($key)}() instanceOf \Illuminate\Database\Eloquent\Relations\Relation
                ) {
        
                    $relation = $this->{Str::camel($key)}();
                    $model = $relation->getModel();
                    $attributesForRelation = $model->getAttributes();
                    foreach ($model->getFillable() as $column)
                    {
                        if (! array_key_exists($column, $attributesForRelation))
                        {
                            $attributesForRelation[$column] = null;
                        }
                    }
        
                    $attributes[$key] = $attributesForRelation;
                } else {
                    $attributes[$key] = $value;
                }
            }
        
            return $attributes;
        }
        

        【讨论】:

          【解决方案6】:

          这对我有用:

          $attributes = new App\Models\NameModel();
          $attributes->getFillable();
          

          【讨论】:

            猜你喜欢
            • 2015-06-12
            • 2014-12-05
            • 2017-02-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多