使用Paginate为数据表的属性建模的Laravel JSON字段

使用Paginate为数据表的属性建模的Laravel JSON字段,json,laravel,model,Json,Laravel,Model,我的代码有一个Json列,名为:Json,用于自定义用户字段。我希望我的datatable将json列作为单独的字段显示。因此,如果我的模型返回的数据为: { "id":1 "json" : { "name": "joe" } } 我需要将其转换为(当我调用Model::all()或Model::paginate()时): 这样我的Datatable就可以显示这些数据了。我无法将appends属性添加到我的模型中,因为这个json是动态字段,因此从一开始就不知道。我尝试

我的代码有一个Json列,名为:Json,用于自定义用户字段。我希望我的datatable将json列作为单独的字段显示。因此,如果我的模型返回的数据为:

{
"id":1
"json" : {
    "name": "joe"    
    }
}
我需要将其转换为(当我调用Model::all()或Model::paginate()时):

这样我的Datatable就可以显示这些数据了。我无法将appends属性添加到我的模型中,因为这个json是动态字段,因此从一开始就不知道。我尝试了以下两种变体:

public function getJsonAttribute($value)
{
    $json = json_decode($value);
    foreach ($json as $k => $v) {

        array_push($this->appends, $key);
        // or
        $this->attributes[$k] = $v;
    }
    return $json;
}

但是它们都不起作用。

在你的情况下,这可能是有效的。但它的多数组意味着您可以再添加一个foreach循环。那就只有工作了

代码中未定义$key

public function getJsonAttribute($value)
{
    $json = json_decode(json_encode($value),TRUE);
    $jsonArr = [];
    foreach ($json as $k => $v) {
        if($k == "id")
            $jsonArr['id'] = $v; 
        if($k == "json" && empty($v['name']) === false)
            $jsonArr['name'] = $v['name']; 
    }

    return (object)$jsonArr;
}

在你的情况下,这可能是工作。但它的多数组意味着您可以再添加一个foreach循环。那就只有工作了

代码中未定义$key

public function getJsonAttribute($value)
{
    $json = json_decode(json_encode($value),TRUE);
    $jsonArr = [];
    foreach ($json as $k => $v) {
        if($k == "id")
            $jsonArr['id'] = $v; 
        if($k == "json" && empty($v['name']) === false)
            $jsonArr['name'] = $v['name']; 
    }

    return (object)$jsonArr;
}
哦,谢谢你在$key上的错误。虽然您的代码执行默认操作。Json已经返回一个键=>值对的关联数组,所以我不需要再次将其转换为数组来返回。我通过在集合中循环并在模型的所有实例上运行一个函数解决了这个问题,该模型运行了我应用于getJsonAttribute的foreach循环。虽然您的代码执行默认操作。Json已经返回一个键=>值对的关联数组,所以我不需要再次将其转换为数组来返回。我通过在集合中循环并在模型的所有实例上运行一个函数来解决这个问题,该模型运行我应用于getJsonAttribute的foreach循环。