想要使用laravel启用/使用/替代JSON_EXTRACT方法,该方法与SQLite,PostgreSQL,MySQL和MSSQL数据库中的JSON_EXTRACT一样。
以下查询适用于 MySQL ,其中table2
。attribute_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
答案 0 :(得分:0)
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字符串。这将是低效的并且可能容易出错。否则,您需要根据您正在使用的数据库定制查询。