【问题标题】:Laravel model - uncast specific columnLaravel 模型 - 未转换的特定列
【发布时间】:2020-03-18 12:32:26
【问题描述】:

我有一个 laravel 表,其中包含我在迁移中这样定义的列:

$table->json('json');

在模型中,我将其转换为数组:

protected $casts = [
    'json' => 'array'
];

这在我需要它的大部分时间都非常有效,但是我正在调用一个 api 调用,我实际上希望我的模型集合为我提供原始字符串,而不是将其转换为数组。

所以,假设我的模型名为 Model,我的 api 调用如下所示:

$systemModels = Model::whereNull('user_id')->get();
$userModels = Model::where('user_id', $user->id)->get();

return response()->json([
        'user_models' => $userModels->toArray(),
        'system_models' => $systemModels->toArray()
    ]);

这是我希望将模型的“json”列呈现为字符串而不是强制转换为数组的地方。有可靠的方法吗?

【问题讨论】:

  • 我接受一种可能性是我从模型中移除演员表并在我确实需要它作为数组的地方使用json_decode,但我只是不确定 Laravel 是否有设施做我在这里问的,我想知道。
  • 我认为你可以设置一个 mutator。将字段转换为数组的一种。如果 Laravel 在处理强制转换数组之前设置了属性,那么也许你可以通过定义一个 getter 来获取原始字符串......
  • 所以你希望api返回{"json": "[1, 2]"}而不是{"json": [1, 2]}?我会对你的 api tbh 感到非常恼火。
  • @Jerodev 是的!但是我的 api 的用例,在这个特定的端点上返回它是有意义的。你不会生气,因为你永远不需要将它作为一个对象,作为我的 api 的消费者来访问。您只想更改字符串。

标签: php laravel


【解决方案1】:

在您的模型中,您可以定义在模型序列化时添加的自定义属性:

class YourModel extends Model
{
    protected $appends = ['json_raw'];

    public function getJsonRawAttribute()
    {
        return $this->attributes['json'];
        // or return json_encode($this->attributes['json']);
    }
}

然后在执行toArray() 时,您可以执行$userModels->makeHidden('json')->toArray(); 来删除您不想要的强制转换字段。

【讨论】:

  • Tis 仍将在数组中包含已转换的 json 属性。
  • @Jerodev 当你像我说的那样做makeHidden('json') 时它不会。
  • 'json' 字段仍会显示,但不会转换为数组?
  • @TKoL 您将拥有一个新字段 json_raw,如果您想删除已转换的字段,请使用 $model->makeHidden('json')->toArray()
猜你喜欢
  • 2014-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 2023-03-11
  • 2020-03-23
  • 2014-04-11
相关资源
最近更新 更多