質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

5371閲覧

Laravelでjsonカラムの検索を行いたい

ms5025

総合スコア292

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/07/17 23:51

前提

Laravelのwhereを使ってjsonの値を前方一致で絞り込んで取得したい

実現したいこと

testテーブル

idとhoge列があるとして

id / hoge (型:json) 1 ['TTaaaa','TTbbb','TTbaaa'] 2 ['TTvv','TTgg','TTrrb'] 3 ['TTvv','TTgz','TTbr']

という上記のようなデータで
「TTg」
という文言で前方一致で検索し、sqlで言うdistinctのような形で

TTgg,
TTgz

というhogeのjson内の文字列を取得したいです

そこで以下のようにlike検索をかけました

$model->where('hogehoge', 'LIKE', '%"TTg' );

そうすると当たり前に
2 ['TTvv','TTgg','TTrrb']
3 ['TTvv','TTgz','TTbr']

のhogeのjsonが取れてきます。
それを

$hoge = array_unique(Arr::flatten($hoge));

のようにして、

TTgg,
TTgz

の二文字を配列で取得することに成功しました。
しかしarray_uniqueなどを使わずにlaravelのクエリビルダだけで
一発で同じことを実現できたりしますでしょうか?
他にいい方法がないか知りたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

whereRaw で json の検索する以外に方法はないですよ

https://qiita.com/ukyooo/items/19da224866affa97a211

投稿2022/07/18 05:47

phper.k

総合スコア3923

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ms5025

2022/07/18 06:34

ということはやはり上記と同じことしか方法がなさそうということでよかったですか?
phper.k

2022/07/18 06:48

リンク先の記事読んでますかね?
phper.k

2022/07/18 06:53 編集

JSON_CONTAINS関数使って検索するのがセオリーです。 Laravel には JSON_COMTAINS をラップするメソッドはないのだから、whereRaw でSQLを組み立てるしかない。 ただし、JSON_CONTAINS では完全一致しか検索できないのだから、実現方法は、テーブル構造を用件に合わせて変更するしかないでしょう。 https://dev.mysql.com/doc/refman/8.0/ja/json-search-functions.html
ms5025

2022/07/19 01:30

読みましたよ。その上でその回答をしています。 JSON_CONTAINSは完全一致しか無理でLIKE検索できなので上記の方法しかないのでは?ということを言ってるのですが 間違ってますか?
ms5025

2022/07/19 01:38

また、こちらリンク先、MySQLなのですがDBはpostgresでも同じなのでしょうか? (今回私が使用しているのはpostgresです)
ms5025

2022/07/19 02:16

JSON_CONTAINSってpostgresでも使えますか? そもそもLIKE検索をしたいというのが先にある条件なので JSON_CONTAINは使えないのではないですか?
ms5025

2022/07/19 02:17

そうなると、 $model->where('hogehoge', 'LIKE', '%"TTg' ); として普通にjsonをテキストと見た目ててLIKE検索してから arrayの中から適切な文言をとってくる以外の方法が自分は見当たらなかったということです。 これ以外のやり方がありますか?
phper.k

2022/07/19 02:25

> 実現方法は、テーブル構造を用件に合わせて変更するしかないでしょう。 JSONカラムで定義することをやめる
ms5025

2022/07/19 02:46

本当それすぎて、ぐうの音も出ないわけですが 自分だけのシステムではないため、テーブル構造は変更できません・・・。 それが一番なのですが。
phper.k

2022/07/19 03:12 編集

仕様でデッドロックがあるなら、そんなものは、政治判断するしかないでしょうが。 部分一致をやめて、完全一致検索にするか、テーブルを変更するか。 その2択しかないんですから、然るべき人に相談したら?
ms5025

2022/07/20 05:30

ということで、 >一発で同じことを実現できたりしますでしょうか? という答えとしては ないので、上記の方法しかないということでよかったでしょうか? JSON_CONTAINSは完全一致しか無理でLIKE検索できなので上記の方法しかないのでは?ということを言ってるのですが
phper.k

2022/07/20 05:54

Like ははなからありえないアプローチですので、問題外ですね。
ms5025

2022/07/21 06:29

なるほど。 ではjsonの値 ['TTvv','TTgg','TTrrb'] を TTvv TTgg TTrrb のように三行でselectしてくる方法ってあるのでしょうか? 例えば、これができればLIKEも使えるのかと思ったのですが
phper.k

2022/07/21 06:49 編集

前提条件として、JSONの形式を厳密に定義されていないとできませんよね? そこの説明をお願いします。 単純な配列形式だけでJSONは説明できませんよね? KEY を含む可能性はあるのかとか 2次元配列のように階層は深くなる可能性はあるのかとか。 JSONデータの登録時に適切なバリデーションがされていて、想定外のデータが入ってくる可能性はないのかなど。 この辺の説明が不足しているので、回答としては、「Like 検索はあり得ない」よとしか回答できません。 JSONであれば、JSONとして扱える形式として想定できる形式全てを満たす回答をせざるを得ません。
ms5025

2022/07/21 11:56

keyは含みません 例に挙げたように、(['TTvv','TTgg','TTrrb']) 一次元配列です JSONデータのバリデーションとLike検索は何の関係もないと思います
ms5025

2022/07/21 12:39

SELECT test.id, hoges.value hoge FROM test CROSS JOIN LATERAL jsonb_array_elements (test.hoge) hoges でjsonbのデータを行で取得することができました。 TTvv TTgg TTrrb なのでこれに対してLike検索をかけようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問