如果您提前知道只会存在某些动态字段,则可以选择为它们创建访问器方法。例如,您可以将其添加到您的模型中:
// Dynamic fields must be cast as an array to iterate through them as shown below
protected $casts = [
'dynamic_fields' => 'array'
];
// ...
public function getColorWayAttribute()
{
foreach ($this->dynamic_fields as $field) {
if ($field['name'] === 'COLOR WAY') {
return $field['value'];
}
}
return null;
}
这将允许您执行以下操作:
$colorWay = $material->color_way;
或者,如果您的组合dynamic_fields
不受限制,可能有大量,或者您希望有更大的灵活性以便能够添加更多并让它们可访问,您可以覆盖getAttribute
Laravel 模型类的方法。
// Dynamic fields must be cast as an array to iterate through them as shown below
protected $casts = [
'dynamic_fields' => 'array'
];
// ...
public function getAttribute($key)
{
$attribute = parent::getAttribute($key);
if ($attribute === null && array_key_exists('dynamic_fields', $this->attributes)) {
foreach ($this->dynamic_fields as $dynamicField) {
$name = $dynamicField['name'];
if (str_replace(' ', '_', mb_strtolower($name)) === $key) {
return $dynamicField['value'];
}
}
}
return $attribute;
}
这种方法调用 Laravel 的实现getAttribute
它首先检查您是否定义了实际的属性,或者是否为该属性定义了访问器(就像我的第一个建议一样),然后检查基模型类上是否存在具有该名称的方法,最后尝试加载关系(如果您已定义)。
当这些方法中的每一种都失败时(null
返回),然后我们检查是否有dynamic_fields
模型中的属性。如果有,我们循环遍历每个动态字段(假设您的dynamic_fields
被投射为array
),然后我们将定义的动态字段的名称转换为小写,并用下划线替换空格。然后,我们最后检查刚刚派生的名称是否与提供的键匹配,如果匹配,我们返回该值。如果没有的话,原来的$attribute
将被返回,这将是null
.
这将允许您获取任何动态字段,就像它们被定义为类中的属性一样。
$colorWay = $material->color_way;
$description = $material->description;
$refNum = $material->ref_num;
请注意:我还没有测试过这段代码,很可能存在一两个问题。尝试一下,看看它是否适合您。另请注意,这仅适用于获取动态字段,设置它们将需要重写另一个方法。