MySQL:从JSON字段中选择布尔值

时间:2017-07-25 13:24:17

标签: php mysql json pdo mysql-json

我正在使用MySQL 5.7.19

我正在尝试检索一个看起来如下的类

class Task
{
    public $title;
    public $done;
}

titledone属性保存在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”而不是布尔值。

1 个答案:

答案 0 :(得分:1)

我认为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;});