【问题标题】:Laravel Eloquent retrieve row with JSON columnLaravel Eloquent 检索带有 JSON 列的行
【发布时间】:2016-09-12 17:38:54
【问题描述】:

我的表中有以下数据

表:

id    |name   | option_data

1     |Joe    |{"gender":"Male","cnic":"1234567","dob":"2016-03-14"}     
2     |Doe    |{"gender":"Male","cnic":"9999","dob":"2016-03-14"}     

如何获取正确的 json_encode 格式的数据。

例如,如果我写

echo json_encode($app->auth->users);

我的 option_data 输出

option_data":"{\"gender\":\"Male\",\"cnic\":\"61101-6859110-3\",\"dob\":\"2016-03-14\"}"

我的数据库列类型是Text。如果我使用 stripslashes 删除所有 \ 仍然数据不是有效的 JSON,因为它包含在 " 双引号中。

问题

如何使用所有其他库获得正确的 json_encode 格式的数据。

【问题讨论】:

    标签: php json laravel eloquent


    【解决方案1】:

    您可以在模型中使用 $casts 变量,它会自动转换为 json 并反转为数组。

    protected $casts = [
         "option_data" => "array"
    ];
    

    【讨论】:

    • 看起来更像 laravel 的演员阵容。
    【解决方案2】:

    尝试在您的模型中使用访问器,到您的数据模型

    public function getOptionDataAttribute($value)
    {
        return json_decode($value);
    }
    

    并在您的控制器中返回:

    return Model::all(); //What you need to retrieve 
    

    输出必须是:

    {
        id: 1
        name: name,
        option_data: {"gender":"Male","cnic":"1234567","dob":"2016-03-14"}
    }
    

    【讨论】:

    • 得到未定义的函数 response()。我的实际代码有点复杂,它使用了 hasMany 方法。
    • 该代码应该可以工作,您将访问器放入您的模型应用程序中并返回您的控制器 $applicants 对吗?它在我的项目中工作@Nomi
    • 抱歉,我刚刚删除了我的 cmets。我对访问者的了解较少。现在我已经研究并测试了它。我在这里面临一个问题。如果我使用getnameAttribute 并尝试修改它可以正常工作,但我列的名称有下划线,例如在getOption_dataAttribute 它不起作用并显示未定义的方法错误。实际上它正在寻找getOptiondataAttribute 我应该重命名我的列名还是有正确的方法?
    • @Nomi 将访问者设置为getOptionDataAttribute,我刚刚编辑了我的答案
    • 感谢您的帮助。我已将 options_data 更改为 database 列中的 optiondata 以使其正常工作。还有一件事我也用过echo $app->auth->users__tostring()。
    猜你喜欢
    • 2018-02-16
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2013-05-20
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多