【发布时间】: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 开始的连续索引(在第一种情况下,您的项目分别为
0、2索引) -
您是返回
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