gpt4 book ai didi

php - Yii2 Active Record JSON 响应,类型转换问题

转载 作者:可可西里 更新时间:2023-11-01 13:36:13 25 4
gpt4 key购买 nike

我在 Yii2 中遇到了一个奇怪的问题我有一个查询,它有一个与代理表的连接和一个(一对多)作业与任务的关系,它工作正常但问题是它返回字符串中的所有内容。以下是查询:

 $query = self::find()
->select("job.*, agent.first_name,agent.last_name")
->leftJoin('agent', 'job.agent_id = agent.id')
->with('tasks')
->asArray()
->all();

和 JSON 编码的结果:

{
"success": true,
"data": [
{
"id": "10",
"customer_id": "1",
"job_type": "normal",
"created": "2016-06-22 10:19:25",
"first_name": "Shayan",
"last_name": "",
"tasks": [
{
"id": "10",
"job_id": "10",
"title": "bring food",
"instruction": null,
"created": "2016-06-22 10:19:25",

},
{
"id": "10",
"job_id": "10",
"title": "bring pizza",
"instruction": null,
"created": "2016-06-22 10:19:25",

},
]
}

如果您注意到 id、customer_id 和 job_id 等字段,它们都是整数,但返回的是字符串。但是如果我从上面的查询中删除 ->asArray() 它返回有效的类型转换但问题是它跳过关系和 leftJoin 代理表字段,它只返回作业表字段这里是从上面的查询中删除 ->asArray() 后的响应。

{
"success": true,
"data": [

{
"id": 10,
"customer_id": 1,
"name": null,
"job_type": "normal",
"created": "2016-06-22 10:19:25",
},

如果您在上面的响应中注意到它没有完全跳过代理表 first_name、last_name 和关系数据任务,但 id 和 customer_id 是整数。

有人遇到同样的问题吗?非常感谢您的帮助。提前致谢。

最佳答案

我想确保确实如此。我自己用非常相似的查询对此进行了测试,结果非常相似:

array(2) {
[0]=>
array(5) {
["id"]=>
string(1) "1"
["name"]=>
string(5) "Admin"
// ...
}
// ...
}

在我的例子中,我还将所有类型都作为字符串获取。因此,如果您要使用 if ($data[0]['id'] === 1) 检查输入及其类型,您将得到 false 结果,因为它是 string

但是你需要做的是在变量前添加(int) 来将其转换为不同的类型转换。这将是:(int) $data[0]['id']

然后 var_dump((int) $data[0]['id']); (在我的例子中)将给出 int(1) 而不是 字符串(1) "1"

您还可以 checkin 条件:

((int) $data[0]['id'] === 1) ? exit('Integer') : exit('Not integer');

不写 (int) 作为前缀将给出 Not integer 结果,而带有前缀将产生 Integer

如果你不想在每个函数中都写这些前缀,你可以这样写:

$data[0]['id'] = (int) $data[0]['id'];

现在 $data[0]['id'] 在未来的使用中将是 integer


新解决方案:

这个新解决方案将返回一个包含数组的对象,而不仅仅是数组。

// Method that gives data back. In this case, user with ID == 10.
public static function getData()
{
$dataProvider = new ActiveDataProvider([
'query' => self::findOne(['id' => 10])->attributes
]);

return $dataProvider;
}

在 Controller 中,您(一如既往)传递此对象:

$data = User::getData();

return $this->render('user', [
//...
'data' => $data
]);

然后在 Viewer 中,您可以像这样访问值(以正确的类型转换):

$data->query['columnName'];

因此,对于 ID 检查:

($data->query['id'] === 10 ? exit('ok') : exit('nok'));

您将收到响应 ok(类型转换:整数,值:10)。

关于php - Yii2 Active Record JSON 响应,类型转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38724778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com