获取具有所有属性的 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 模型的主要内容,如果未能解决你的问题,请参考以下文章