获取具有所有属性的 Laravel 模型

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

【参考方案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();

【讨论】:

以上是关于获取具有所有属性的 Laravel 模型的主要内容,如果未能解决你的问题,请参考以下文章

laraver框架学习------工厂模型填充测试数据

获取所有在 Laravel 中具有角色的用户

具有用户 ID laravel 的模型

Laravel 8:获取特定关系的“morphOne”类的所有模型的类名

如何在 Laravel 中使非数据库模型具有两个属性

Laravel/Eloquent - 创建与可能具有或不具有属性的父模型相关的多个子模型的关系