2016-05-08 16 views
4

私はL5.2とMySQL 5.7を使用しています。私は、DBの私のメタ欄に以下のJSONを持っている:Laravel JSON where句の大文字と小文字を区別しません

{"cellphone": "(687) 638-4512 x22934", "last_name": "Bashirian", "first_name": "Fidel"} 

私は、文字列を大文字または小文字であるかどうかを実行するには、次のクエリを取得しようとしています:

User::where('meta->first_name', 'fidel'); 

私のようなものを試してみました:

User::whereRaw('LOWER(meta->"$.first_name") = ?', ['fidel']); 

しかしnullが返されます。どのようにこれを行うには任意のアイデア!?


また、「fidel bashirian」などのフルネームでクエリを実行できるようにしたいと考えました。私はconcat()と試みたが、私はそれがJSON列タイプで動作するかどうかわからないので、私はそれは、以下の機能と連携すること終わった:

protected function name($name) 
{ 
    $name = explode(' ', $name); 

    foreach ($name as $key => $value) { 

     $name[$key] = '%' . strtolower($value) . '%'; 

     $this->builder->where(function ($query) use ($name, $key) { 
      $query->whereRaw('LOWER(meta->"$.first_name") like ?', [$name[$key]]); 
      $query->orWhereRaw('LOWER(meta->"$.last_name") like ?', [$name[$key]]); 
     }); 
    } 

    return $this->builder; 
} 

以前の方法の照会でfidelFidelFIDELfidel bashirianにより、すべての結果が得られます。部分的な名字であっても。

答えて

0

このメソッドを使用して解決しました。これで私はフルネーム(最初の+ '' +最後)または姓または名でクエリを実行できます。これが最も洗練された解決策であるかどうかはわかりません。 fidelによる従来の方法の問合せで

protected function name($name) 
{ 
    $name = explode(' ', $name); 

    foreach ($name as $key => $value) { 

     $name[$key] = '%' . strtolower($value) . '%'; 

     $this->builder->where(function ($query) use ($name, $key) { 
      $query->whereRaw('LOWER(meta->"$.first_name") like ?', [$name[$key]]); 
      $query->orWhereRaw('LOWER(meta->"$.last_name") like ?', [$name[$key]]); 
     }); 
    } 

    return $this->builder; 
} 

FidelFIDELfidel bashirianなど。れるすべての収量をもたらします。部分的な名字であっても。

-2

何かは、 のようにする必要があります。ユーザー::場所( 'first_name'、 'fidel'); は最初にオブジェクトの属性を表し、2番目の値は一致する値を表します

+0

あなたの答えはJSON列の型には当てはまりません。この場合 'fidel'の値は大文字と小文字が区別されるため、結果は返されません。 – enriqg9

+0

カラムからfirst_nameの値を取り出すことができる方が良いでしょう。 – user6288916

+0

更新された投稿を、私が思いついた解決策でチェックしてください。 – enriqg9

関連する問題