2017-09-08 4 views
1

laravelを使用してSQLite、PostgreSQL、MySQL、およびMSSQLデータベースでJSON_EXTRACTと同じように動作するJSON_EXTRACTの有効化/使用/代替メソッドを使用したいとします。laravelを使用してSQLite、PostgreSQL、およびMSSQLデータベースでJSON_EXTRACTメソッドを有効/使用するにはどうすればよいですか?

以下のクエリはで動作しています。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

jsonがデータベース内の複雑なデータ構造です。 4つの異なるデータベースプロバイダで機能する1つのメソッドを見つけるつもりはありません。すべてのメソッドがjsonを扱う独自の方法を持っているからです。

LaravelはMySQLとPostgresの実際のjsonデータ型のみを使用します。 SQLiteとMSSQLの場合、jsonはvarcharフィールドに格納されます。

Laravelは、MySQL(5.7+)とPostgresのjsonフィールドを照会するための "arrow"演算子(->)を理解しています。彼らは、矢印演算子を理解していないよう

$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に失敗します:だから、MySQLとPostgresのために、クエリは次のようになります。

クエリを変更せずにすべてのデータベースプロバイダでこの作業を行う唯一の方法は、jsonデータをすべてのデータベースのvarcharに格納し、次にLIKE演算子を使用してjson文字列をクエリすることです。これは非効率的で、おそらくエラーが発生しやすいでしょう。それ以外の場合は、使用しているデータベースにクエリを適合させる必要があります。

関連する問題