こんにちは!
今回は「Sequelize、氏名検索など複数カラムを跨いで検索したい時の書き方」についてお伝えしたいと思います。
調べてもあまりヒットしなかったので、今回共有させていただきます。
複数カラムを跨いで検索(SELECT)したいときはCONCATを使う
CONCAT
と聞くと、GROUP CONCAT
もありますが、今回はCONCAT
を使います。
以下は実際の書き方の例です。
// node.js環境
const {literal, Op, col} = db.Sequelize;
const db = require('../models/index');
exports.getUser = () => {
const sequelize = db['database'];
const dbName = sequelize.models;
return new Promise((resolve, reject) => {
dbName.user.findOne({
attributes: [
'id',
],
where: sequelize.where(
sequelize.fn(
'CONCAT',
sequelize.col('family_name'), // 引数にはカラム名を指定
sequelize.col('first_name'), // 引数にはカラム名を指定
),
{[Op.like]: `%山田太郎%`}, // 例として固定値で山田太郎としてますが、変数名に置き換えてください。
),
raw: true,
}).then((data) => {
resolve(data);
}).catch((err) => {
reject(err);
});
});
};
このように記述することで、userテーブルから「性(family_name)+名(first_name)」が「山田太郎」に一致するレコードを取得することができます。
注意点として、入力フォームの値から半角スペース、全角スペースをtrimしてあげる必要があります。
入力値変換前:山田 太郎
入力値変換後:山田太郎
以上、お疲れさまでした🍵