sqlite 将Op.like和Op重新排序或失败

dl5txlt9  于 2023-10-23  发布在  SQLite
关注(0)|答案(3)|浏览(116)

我有这个问题与续集:我试图有一个3参数的研究,如果其中一个参数是空的,它不应该考虑该参数。

const users = await User.findAll({
  where: {
    category: { [Op.like]: `%${req.query.category}%` },
    location: { [Op.like]: `%${req.query.location}%` },
    [Op.or]: [
      { job: { [Op.like]: `%${req.query.job}%` } },
      { bio: { [Op.like]: `%${req.query.job}%` } },
      { skills: { [Op.like]: `%${req.query.job}%` } },
    ],
  },
  attributes: { exclude: ['password', 'createdAt', 'updatedAt'] },
})

我发现[Op.like]在任何地方都不起作用。它只在一个参数为空时才起作用(阻止该参数过滤用户,这是我喜欢的东西)。
当我对示例payload {category:'Information Technology', job:'frontend web dev', location:'Sydn'}进行研究时,这被记录在进程日志中:

Executing (default): SELECT `id`, `email`, `firstName`, `lastName`, `image`, `location`, `phone`,
`website`, `availability`, `category`, `job`, `skills`, `bio` FROM `Users` AS `User`
WHERE (`User`.`job` LIKE '%frontend web dev%' OR `User`.`bio` LIKE '%frontend web dev%' OR
`User`.`skills` LIKE '%frontend web dev%') AND `User`.`category` LIKE '%Information Technology%'
AND `User`.`location` LIKE '%Sydn%';

但是没有找到用户。(是的,在数据库中,我有类似参数的用户)

4c8rllxm

4c8rllxm1#

我认为它应该看起来更像这样:

category: { [Op.like]: '%`${req.query.category}%`' },

我在这里所做的是添加单引号标记'。关于documentation

4xrmg8kj

4xrmg8kj2#

在我看来,你的代码和记录的SQL是一样的。我没有看到任何错误。也许你应该尝试复制SQL并将其粘贴到MySQL中(如果你使用MySQL),然后尝试运行它。

qjp7pelc

qjp7pelc3#

我建议您先拆分请求查询。然后你可以选择使用Op.或Op.,这样,你就可以使用它们中的任何一个。
我不确定两个都用。
看看我是如何使用%的。

//typescript
export const searchUsers = async (queryRecord: Record<string, any>, or: boolean) => {
const {name, bio, category} = queryRecord;
const user = await User.findOne({
    where: {
      [or ? Op.or : Op.and]: [{ name: { [Op.like]: "%" + name + "%" } }],
    },
  });    
 };

相关问题