web-dev-qa-db-ja.com

続編:WHERELIKE句のフィールドを連結します

作業中のnode.jsプロジェクトに続編ORMを使用しています。私が持っている1つのクエリは、複数の列の連結結果に対して同様の操作を実行する必要があります。

たとえば、次のようなものです。

SELECT * FROM People WHERE(CONCAT(firstname、 ''、lastname))LIKE '%John Do%'。

私は次の構文を使用していますが、RAWクエリを使用せずにこれが可能かどうかを知りたいです(これは私のソリューションの他のどこにもありません)。

   var criteria = {
        include: [
            occupation
        ],
        where: {
            is_active: 1
        },
        nest: false
    };

    db.people.findAll(criteria, {}).then(function(people) {
        success(people);
    }).catch(function(err) {
        error(err);
    });

何か案は?

9
tribe84

このようなものが必要になります

var criteria = {
    where: Sequelize.where(Sequelize.fn("concat", Sequelize.col("firstname"), Sequelize.col("lastname")), {
        like: '%John Do%'
    })
}

注:未テスト

元のソース

18
code-jaff

@ code-jaffに触発されていますが、これを正しく機能させるには、姓と名の間にスペース文字列を連結する必要があります。それ以外の場合は、「JohnDoe」に対してのみ返され、「JohnDoe」に対しては返されません。これがコードです。

  Sequelize.where(Sequelize.fn('concat', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), {
    like: '% John Doe %'
  })

これがクエリのどこに当てはまるかわからない人にコンテキストを提供するために、これはwhereまたはステートメントの上記のコードの例です。 req.body.queryは、POSTする変数検索用語です。

Users.findAll({
  where: {
    $or: [
      Sequelize.where(Sequelize.fn('concat', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), {
        like: '%' + req.body.query + '%'
      }),
        { email: { $like: '%' + req.body.query + '%' } },
        { companyName: { $like: '%' + req.body.query + '%' } }
    ]
  }
})

Sequelize 4.0のアップデート

文字列ベースの演算子(上記の例では$likeおよび$or)は非推奨になり、シンボルベースの演算子が採用されました。それはセキュリティにとって良いことです

参照: http://docs.sequelizejs.com/manual/tutorial/querying.html#operators

これらの演算子は、[Sequelize.Op.like]および[Sequelize.Op.or]に置き換えられます。ドキュメントで強調表示されている続編オプションで構成する他の方法もあります

13
yjimk