【问题标题】:Yii2 json response converts arrays to JSON objects, not json arraysYii2 json 响应将数组转换为 JSON 对象,而不是 json 数组
【发布时间】:2018-04-21 21:05:20
【问题描述】:

我有一个 yii2 模型和关系。
Yii2 响应格式设置为 JSON。
我想返回模型及其关系(一对多),到目前为止一切都很好。

但是,在这种情况下,对于模型关系之一,JSON 响应编码为 JSON 对象 {},而不是数组 []。我不知道为什么?对于其他关系,它是一个数组。

下面是一个模型的 var_dump。有问题的关系是items

/backend/controllers/TasksController.php:181:
object(app\models\Task)[163]
  private '_attributes' (yii\db\BaseActiveRecord) => 
    array (size=6)
      'id' => int 9
      'title' => string 'Sample dnewsd' (length=13)
      'mode' => string 'onlyads' (length=7)
      'deployed' => int 0
      'start_time' => string '2017-11-16 00:00:00' (length=19)
      'end_time' => null
  private '_oldAttributes' (yii\db\BaseActiveRecord) => 
    array (size=6)
      'id' => int 9
      'title' => string 'Sample dnewsd' (length=13)
      'mode' => string 'onlyads' (length=7)
      'deployed' => int 0
      'start_time' => string '2017-11-16 00:00:00' (length=19)
      'end_time' => null
  private '_related' (yii\db\BaseActiveRecord) => 
    array (size=3)
      'items' => 
        array (size=2)
          0 => 
            object(app\models\TaskItem)[178]
              ...
          2 => 
            object(app\models\TaskItem)[201]
              ...
      'devices' => 
        array (size=0)
          empty
      'deviceGroups' => 
        array (size=0)
          empty

这是我编辑模型时返回的 JSON:

{
    "status": "ok",
    "data": {
        "id": 9,
        "title": "Sample task",
        "mode": "onlyads",
        "deployed": 0,
        "start_time": "2017-11-16 00:00:00",
        "end_time": null,
        "items": {
            "0": {
                "id": 2,
                "image_url": "/media/lightboxes/pictures/ad_.jpg",
                "duration": 20,
                "task_id": 9
            },
            "2": {
                "id": 46,
                "image_url": "/media/lightboxes/pictures/ad_46.jpg",
                "duration": 20,
                "task_id": 9
            }
        },
        "devices": [],
        "deviceGroups": []
    }
}

可以看到items不是JSON数组:items : {}

在另一个操作中 - 获取返回的 JSON 具有 items: [] 的相同模型:

{
    "status": "ok",
    "data": {
        "id": 9,
        "title": "Sample dnewsd",
        "mode": "onlyads",
        "deployed": 0,
        "start_time": "2017-11-16 00:00:00",
        "end_time": null,
        "items": [
            {
                "id": 2,
                "image_url": "/media/lightboxes/pictures/ad_.jpg",
                "duration": 20,
                "task_id": 9
            },
            {
                "id": 46,
                "image_url": "/media/lightboxes/pictures/ad_46.jpg",
                "duration": 20,
                "task_id": 9
            }
        ],
        "devices": [],
        "deviceGroups": []
    }
}

这是 GET 操作中同一模型的 var_dump:

/srv/www/erp-ang/backend/controllers/TasksController.php:55:
object(app\models\Task)[163]
  private '_attributes' (yii\db\BaseActiveRecord) => 
    array (size=6)
      'id' => int 9
      'title' => string 'Sample dnewsd' (length=13)
      'mode' => string 'onlyads' (length=7)
      'deployed' => int 0
      'start_time' => string '2017-11-16 00:00:00' (length=19)
      'end_time' => null
  private '_oldAttributes' (yii\db\BaseActiveRecord) => 
    array (size=6)
      'id' => int 9
      'title' => string 'Sample dnewsd' (length=13)
      'mode' => string 'onlyads' (length=7)
      'deployed' => int 0
      'start_time' => string '2017-11-16 00:00:00' (length=19)
      'end_time' => null
  private '_related' (yii\db\BaseActiveRecord) => 
    array (size=3)
      'items' => 
        array (size=2)
          0 => 
            object(app\models\TaskItem)[178]
              ...
          1 => 
            object(app\models\TaskItem)[184]
              ...
      'devices' => 
        array (size=0)
          empty
      'deviceGroups' => 
        array (size=0)
          empty

任何线索为什么会发生这种情况?

【问题讨论】:

  • 您的数组需要有从 0 开始的连续索引(在第一种情况下,您的项目分别为 02 索引)
  • 您是返回ActiveRecord 还是致电->toArray()
  • @csminb。嗯,这并不明显.. 谢谢。如果您以前遇到过这种情况,也许您知道 - 我将如何重新索引关系数组的值?因为$model->items 是 Yii 中的只读属性,所以我不能做类似$model->items = array_values($model->items) 的事情。从 db 重新加载模型?
  • @csminb。 Yii2 在将 ActiveRecord 编码为 JSON 时应该自动调用 ->toArray()。数组接口。
  • 我不确定它是如何在内部进行的,但手动调用它可能会让您更好地控制要显示的字段/关系 ($task->toArray([], ['items', 'devices']) 通常在调用时不应转换关系toArray 除非你指定 extra fields

标签: json yii2


【解决方案1】:

数组需要有从0开始的连续索引,
如果你需要重新索引一个已经加载的关系,你可以运行

$task->populateRelation('items', array_values($task->items));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    • 2012-07-21
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    相关资源
    最近更新 更多