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

时间:2017-09-08 06:44:31

标签: php mysql postgresql laravel sqlite

想要使用laravel启用/使用/替代JSON_EXTRACT方法,该方法与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

1 个答案:

答案 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字符串。这将是低效的并且可能容易出错。否则,您需要根据您正在使用的数据库定制查询。