Получить модели Laravel со всеми атрибутами

есть ли способ получить модель в Laravel со всеми атрибутами, даже если они нулевые? Кажется, что он возвращает только модель с атрибутами, которые не являются нулевыми.

причина в том, что у меня есть функция, которая обновит атрибуты модели из массива, если атрибуты существуют в модели. Я использую функцию property_exists (), чтобы проверить модель, имеет ли она определенный атрибут перед ее установкой. Ожидается, что ключ массива и атрибут модели будут совпадать, поэтому вот как это работает.

Он отлично работает, если модель уже имеет набор атрибутов, потому что атрибут существует и принимает значение из массива. Но ничего не будет обновлено или установлено, если атрибут ранее был нулевым, потому что он не проходит проверку property_exists ().

в конечном итоге происходит то, что у меня есть один массив атрибутов, а затем, возможно, две модели. И я запускаю свою функцию setter, передавая массив атрибутов и каждый из объектов в отдельные звонки. Если у модели есть свойство matching, она обновляется.

4 ответов


вот два способа сделать это. Один из методов-определить значения атрибутов по умолчанию в вашей модели.

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

В принципе, если атрибут не был установлен, это добавит нулевое значение к этому атрибуту и вернет его вам в виде массива.


$model->getAttributes();

выше вернет массив необработанных атрибутов (как хранится в таблице базы данных)

$model->toArray() 

выше вернет все необработанные, мутированные(если используется) и добавленные атрибуты модели

надеюсь, что это будет полезно!!


обновление:

если вы пытаетесь сделать это после создания экземпляра так:

$model = new Model;

тогда, пожалуйста, отличаться от ответа Томаса Кима.

в противном случае: Вы можете использовать toArray() или getArributes() метод на экземпляре модели, который вернет все атрибуты, включая нули. Тогда вы можете использовать array_key_exists чтобы проверить.

вот так:

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

Что делать, если вы были, чтобы явно объявить все поля, которые вы хотите вернуть.

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

очень общий пример, но, надеюсь, кто-то найдет это полезным.