Php 如何使用laravel在SQLite、PostgreSQL和MSSQL数据库中启用/使用JSON_提取方法?

Php 如何使用laravel在SQLite、PostgreSQL和MSSQL数据库中启用/使用JSON_提取方法?,php,mysql,postgresql,laravel,sqlite,Php,Mysql,Postgresql,Laravel,Sqlite,希望启用/使用/替代JSON_提取方法,该方法与使用laravel的SQLite、PostgreSQL、MySQL和MSSQL数据库中的JSON_提取方法相同 下面的查询在MySQL中运行,其中table2attribute\u data是json数据的列 $query->select('table1.*'); $query->where(function ($q) use ($locale) { $q->where(Db::raw('JSON_

希望启用/使用/替代JSON_提取方法,该方法与使用laravel的SQLite、PostgreSQL、MySQL和MSSQL数据库中的JSON_提取方法相同

下面的查询在MySQL中运行,其中
table2
attribute\u 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字段的“arrow”操作符(
->
)。因此,对于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字符串。这将是低效的,而且可能容易出错。否则,您需要根据所使用的数据库定制查询。

json
是数据库中的一个复杂数据结构。您不会发现一种方法可以跨四个不同的数据库提供程序工作,因为它们都有自己处理json的专有方法

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

Laravel理解在MySQL(5.7+)和Postgres中查询json字段的“arrow”操作符(
->
)。因此,对于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字符串。这将是低效的,而且可能容易出错。否则,您需要根据所使用的数据库定制查询