gpt4 book ai didi

php - 我如何使用 laravel 在 SQLite、PostgreSQL 和 MSSQL 数据库中启用/使用 JSON_EXTRACT 方法?

转载 作者:行者123 更新时间:2023-11-29 13:47:25 27 4
gpt4 key购买 nike

想要启用/使用/替代 JSON_EXTRACT 方法,它与使用 laravel 的 SQLite、PostgreSQL、MySQL 和 MSSQL 数据库中的 JSON_EXTRACT 一样工作。

以下查询在 MySQL 中运行,其中 table2attribute_data 是 json 数据列。

    $query->select('table1.*');
$query->where(function ($q) use ($locale) {
$q->where(Db::raw('JSON_EXTRACT(`table2`.`attribute_data`, "$.title")'), '!=', "");
$q->where('table2.locale', '=', $locale);
});
$query->join('table2', function ($join) use ($locale) {
$join->on('table1.id', '=', 'table2.model_id');
});

错误: SQLSTATE[HY000]:一般错误:1 没有这样的函数:JSON_EXTRACT

最佳答案

json 是数据库中的复杂数据结构。您不会找到一种方法适用于四个不同的数据库提供程序,因为它们都有自己处理 json 的专有方式。

Laravel 只为 MySQL 和 Postgres 使用实际的 json 数据类型。对于 SQLite 和 MSSQL,json 存储在 varchar 字段中。

Laravel 理解用于查询 MySQL (5.7+) 和 Postgres 中的 json 字段的“箭头”运算符 (->)。因此,对于 MySQL 和 Postgres,您的查询将如下所示:

$query->select('table1.*')
->join('table2', function ($join) {
return $join->on('table1.id', '=', 'table2.model_id');
})
->where(function ($q) use ($locale) {
return $q
->where('table2.attribute_data->title', '!=', "")
->where('table2.locale', '=', $locale);
});

但是,这在 SQLite 和 MSSQL 中可能会失败,因为它们不理解箭头运算符。

在不更改查询的情况下跨所有数据库提供程序进行这项工作的唯一方法是将 json 数据存储在所有数据库的 varchar 中,然后使用 LIKE 运算符查询 json 字符串。这将是低效的并且可能容易出错。否则,您需要根据您正在使用的数据库调整查询。

关于php - 我如何使用 laravel 在 SQLite、PostgreSQL 和 MSSQL 数据库中启用/使用 JSON_EXTRACT 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46110197/

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