Получить модели 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;
}
очень общий пример, но, надеюсь, кто-то найдет это полезным.