获取具有所有属性的拉拉维尔模型

2022-08-30 14:14:47

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

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

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

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


答案 1

以下是执行此操作的两种方法。一种方法是在模型中定义默认属性值。

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 值附加到该属性,并将其作为数组返回给您。


答案 2
$model->getAttributes();

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

$model->toArray() 

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

希望它会有所帮助!


推荐