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

时间:2015-11-04 01:28:25

标签: php laravel model eloquent laravel-5.1

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

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

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

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

5 个答案:

答案 0 :(得分:16)

以下是两种方法。一种方法是在模型中定义默认属性值。

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;
}

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

答案 1 :(得分:5)

$model->getAttributes();

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

$model->toArray() 

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

希望它会有所帮助!!

答案 2 :(得分:1)

<强>更新

如果您在实例化之后尝试执行此操作:

$model = new Model;

然后请与Thomas Kim的回答不同。

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

像这样:

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

答案 3 :(得分:0)

如果要显式声明要返回的所有字段怎么办。

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;
}

非常普通的示例,但希望有人会发现它有用。

答案 4 :(得分:0)

我在另一个项目中有这个代码片段,以加载所有模型属性和关系。

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;
}