2018年6月10日日曜日

knexライブラリで動的パラメータを使ったlike検索をする方法


オフィス狛 技術部 CTOの Taka-yamです。
Node.js のアプリケーションを開発していて、
SQLを構築するためにknexというライブラリを活用しています。
http://knexjs.org

素のSQLに近い形でfluentにSQLを構築できるので大変便利なのですが、
動的パラメータでlike検索を行うとした際に値の設定方法ではまったので共有します。

下記のようなユーザテーブルがあるとします。
User
id: String
name: String

textという変数に入力された値が格納されているとして
ユーザテーブルのnameカラムにあいまい検索を行うとします。

まず最初に思いついたのが、
knex(‘user’).whereRaw(“name like ‘%?%’”, text);

これはエラーとなります。
type \"like\" does not exist"

次に思いついたのが、
knex(‘user’).where('name', 'like', knex.raw('%?%', text));

これもエラーになります。
syntax error at or near \"%\""

次に思いついたのが、
knex(‘user’).whereRaw(‘name like %' + text + '%');

これもエラーになります。
syntax error at or near \"%\""

次に思いついたのが、
knex(‘user’).whereRaw("name like '%" + text + "%'");

これはうまくいきました。

ですが、このような文字列連結をすると弊社で使用している Lint に怒られてgit commitさえ出来ません。(lint-stagedでcommit制限掛けているので)

なので、最終的に、
knex(‘user’).where(‘name’, 'like', `%${text}%`);

となりました。

結論を見ればすごい単純なことなのですが、
結構はまったので、もし同じようなことで困っている人の助けになれば幸いです。

0 件のコメント:

コメントを投稿