php - 对对象数组使用 $casts

标签 php laravel

我有以下类(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/

相关文章:

php - 图形/ Canvas /div的动态改变

php - Laravel 5 中执行哪个路由 http ://localhost:8000/my/8

php - Apache 的 Laravel 文件权限

php - 如何在 Laravel 5 中处理异常和错误信息?

php - 使用 php pdo 从一行中获取 2 个值的短代码

php - Symfony 2.0 NodeDefinition 中的 defaultValue 到底是如何工作的?

php - 使用全局变量动态更改 URL

php - 创建配置文件 (config.php) php 的最佳方式

php - Laravel mssql 驱动支持

php - 在 Laravel 5 注销后防止浏览器的后退按钮登录