MySQL:从 JSON 字段中选择布尔值
MySQL: Selecting boolean value from JSON field
我正在使用 MySQL 5.7.19
我正在尝试检索如下所示的 class
class Task
{
public $title;
public $done;
}
title
和 done
属性保存在 JSON 列中。
我用来检索的代码如下所示:
$tasksSql = <<<'EOT'
SELECT JSON_UNQUOTE(JSON_EXTRACT(data, '$.title')) AS title,
JSON_EXTRACT(data, '$.done') AS done
FROM Tasks WHERE TaskListId = ?;
EOT;
$tasksStatement = $connection->prepare($tasksSql);
$tasksStatement->execute([$id]);
$tasksStatement->setFetchMode(PDO::FETCH_CLASS, "Task");
$taskList->tasks = $tasksStatement->fetchAll(PDO::FETCH_CLASS, "Task");
它填写了所有字段,但是 done
属性 设置了字符串值 "true" 或 "false" 而不是布尔值。
我认为 PDO 没有识别返回的布尔值,它只是假设它只是字符串。这与使用 JSON 无关。您可以更改查询
JSON_EXTRACT(data, '$.done') AS done
进入
JSON_EXTRACT(data, '$.done') = true AS done
将其改为整数 0/1。
或者更改您的 PHP 代码以将返回值解析为布尔值。例如,通过为 tasks
对象添加构造函数:
class Task {
public $title; // string
public $done; // bool
// ...
public function __construct() {
$this->done = $done == 'true';
}
}
甚至让 PDO 使用匿名函数进行转换:
$taskList->tasks = $tasksStatement->fetchAll(PDO::FETCH_FUNC, function($title, $done) { $task = new Task(); $task->title = $title; $task->done = $done == 'true'; return $task;});
我正在使用 MySQL 5.7.19
我正在尝试检索如下所示的 class
class Task
{
public $title;
public $done;
}
title
和 done
属性保存在 JSON 列中。
我用来检索的代码如下所示:
$tasksSql = <<<'EOT'
SELECT JSON_UNQUOTE(JSON_EXTRACT(data, '$.title')) AS title,
JSON_EXTRACT(data, '$.done') AS done
FROM Tasks WHERE TaskListId = ?;
EOT;
$tasksStatement = $connection->prepare($tasksSql);
$tasksStatement->execute([$id]);
$tasksStatement->setFetchMode(PDO::FETCH_CLASS, "Task");
$taskList->tasks = $tasksStatement->fetchAll(PDO::FETCH_CLASS, "Task");
它填写了所有字段,但是 done
属性 设置了字符串值 "true" 或 "false" 而不是布尔值。
我认为 PDO 没有识别返回的布尔值,它只是假设它只是字符串。这与使用 JSON 无关。您可以更改查询
JSON_EXTRACT(data, '$.done') AS done
进入
JSON_EXTRACT(data, '$.done') = true AS done
将其改为整数 0/1。
或者更改您的 PHP 代码以将返回值解析为布尔值。例如,通过为 tasks
对象添加构造函数:
class Task {
public $title; // string
public $done; // bool
// ...
public function __construct() {
$this->done = $done == 'true';
}
}
甚至让 PDO 使用匿名函数进行转换:
$taskList->tasks = $tasksStatement->fetchAll(PDO::FETCH_FUNC, function($title, $done) { $task = new Task(); $task->title = $title; $task->done = $done == 'true'; return $task;});