我有以下类(class):
class Account extends Model
{
protected $casts = [
'industries' => 'json',
];
public function getIndustriesAttribute($value = null)
{
return collect(json_decode($value, true))->map(function ($industry) {
return new Industry($industry);
});
}
}
industries
是数据库中的一个 json 字段。
上面的代码实现了我的目标——如果给定字段被访问,给定字段的值将被 json_decoded,然后转换为 Industry
数组。保存此模型时,行业将根据 $casts
保存为 json。
我想做的是摆脱 getIndustriesAttribute
并让 Laravel 将我的 json 转换为对象的 array - 理想情况下我的代码看起来像这样:
class Account extends Model
{
protected $casts = [
'industries' => Industry::class.'[]',
];
}
当然这行不通,但它给出了我想要发生的事情的想法 - 对象数组应该是 json_encode/json_decoded(Industry 是一个普通对象,因此不需要序列化) .
作为一种解决方法,我编写了这个 castable:
<?php
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
trait ArrayableCast
{
public static function castUsing(array $arguments)
{
if (in_array('[]', $arguments)) {
return new class implements CastsAttributes {
public function get($model, $key, $value, $attributes)
{
return collect(json_decode($value, true))->map(function ($item) {
return new (static::class)($item);
})->all();
}
public function set($model, $key, $value, $attributes)
{
return json_encode(collect($value)->map(function ($item) {
return $item->toArray();
})->all());
}
};
}
return new class implements CastsAttributes {
public function get($model, $key, $value, $attributes)
{
return new (static::class)(json_decode($value, true));
}
public function set($model, $key, $value, $attributes)
{
return json_encode($value->toArray());
}
};
}
}
每个都可以使用
protected $casts = [
'industries' => Industry::class.':[]',
];
但如果有处理这种情况的本地 Laravel,我将不胜感激。
最佳答案
您可以使用我的库,它有一个示例,说明如何使用 Laravel 自定义转换向/从数组转换 - https://github.com/morrislaptop/laravel-popo-caster#2-configure-your-eloquent-attribute-to-cast-to-it
关于php - 对对象数组使用 $casts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67009253/