У меня такой запрос строки
SELECT d.title
FROM DEALS d
LEFT JOIN USER u ON u.idUser = d.userId
WHERE ((d.title LIKE '%gouthamkrishna%' OR d.keywords LIKE '%gouthamkrishna%')
OR CONCAT(u.firstName,'',u.lastName) LIKE '%gouthamkrishna%') AND d.isPublic=1
Я хочу создать эквивалентный запрос ORM на основе этого. Вот мой текущий запрос
//deals table
const Deals = require('deals');
//user table
const User = require('user');
Deals.findAndCountAll({
where:{
isPublic:1,
[Op.or]:[
{title: { $like: '%' + params.keyword + '%' }},
{keywords: { $like: '%' + params.keyword + '%' }}
]
}, attributes:['title'],
include:[
{model:User, required:false,attributes:['firstName'],
where:Sequelize.where(Sequelize.fn('concat_ws', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), {
$like: '%' + params.keyword + '%'
})
}]
})
Но это вернет пустой результат, однако запрос строки возвращает результат
эквивалентный запрос, генерируемый ORM
SELECT 'DEALS'.'idDeal', 'DEALS'.'title', 'USER'.'idUser' AS 'USER.idUser', 'USER'.'firstName' AS 'USER.firstName' FROM 'DEALS' AS 'DEALS' LEFT OUTER JOIN 'USER' AS 'USER' ON 'DEALS'.'userId' = 'USER'.'idUser' AND concat_ws('firstName', ' ', 'lastName') LIKE '%gouthamkrishna%' WHERE ('DEALS'.'title' LIKE '%gouthamkrishna%' OR 'DEALS'.'keywords' LIKE '%gouthamkrishna%') AND 'DEALS'.'isPublic' = 1;
Я думаю, вам нужно просто немного изменить запрос, попробуйте следующее:
Deals.findAndCountAll({
where:{
isPublic:1,
[Op.or]:[
{title: { $like: '%' + params.keyword + '%' }},
{keywords: { $like: '%' + params.keyword + '%' }},
Sequelize.where(Sequelize.fn('concat_ws', Sequelize.col('firstName'), ' ', Sequelize.col('lastName')), {
$like: '%' + params.keyword + '%'
})
]
},
attributes:['title'],
include:[
{
model:User,
required:false,
attributes:['firstName'],
}]
})