2015-07-07 2 views
3

У меня есть модель билета и модель комментария. Билет имеет отношение hasMany к модели комментариев. Я хочу искать билеты по ключевому слову. Ключевое слово будет сопоставлено с атрибутом объекта модели билета и атрибутом body модели комментария.Как реализовать функцию поиска с помощью SequelizeJS?

Приведенный ниже код не работает:

var options = { 
    where: { 
    $or: [ 
     { 
     subject: { 
      like: '%' + query + '%' 
     }, 
     }, 
     { 
     'Comment.body': { 
      like: '%' + query + '%' 
     }, 
     } 
    ] 
    }, 
    include: [ 
    { model: Comment }, 
    ] 
}; 

Ticket.findAll(options); 

Это ошибка: «Возможно, необработанное SequelizeDatabaseError: колонка Ticket.Comment.body не существует»

Я также попытался код ниже, но он также не работает:

var options = { 
    where: { 
    CompanyId: req.company.id, 
    $or: [ 
     { 
     subject: { 
      like: '%' + query + '%' 
     }, 
     }, 
     sequelize.cast(sequelize.col('comment.body'), 'TEXT', 'LIKE', '%' + query + '%') 
    ] 
    }, 
    include: [ 
    { model: Comment, as: 'comment', where: {} }, 
    ] 
}; 

Ticket.findAll(options); 

ошибка: «Возможно, необработанная ошибка: комментарий (комментарий) не связан с билетом»

И это одна:

var options = { 
    where: { 
    CompanyId: req.company.id, 
    $or: [ 
     { 
     subject: { 
      like: '%' + query + '%' 
     }, 
     }, 
     sequelize.where(sequelize.col('Comments.body'), 'LIKE', '%' + query + '%') 
    ] 
    }, 
    include: [ 
    { model: Comment}, 
    ] 
}; 

Ticket.findAll(options); 

Ошибка: "Возможно, необработанное SequelizeDatabaseError: Отсутствующий FROM-п запись для таблицы "Комментарии""

Я использую SequelizeJS версии 2.0.4

Я видел эти связанные с этим вопросы в хранилище Sequelizejs на Github:

Любой знает решение? Заранее спасибо!

+0

Это невозможно без # 3095 - до тех пор, пока это не реализовано, sequelize думает, что все в 'where' находится на главной таблице –

+0

Спасибо @JanAagaardMeier. Хм. нет ли альтернативного решения? Как сделать некоторые части кода выше как необработанные запросы? Или использование полного необработанного запроса - единственное решение? –

+0

https://github.com/sequelize/sequelize/issues/3095#issuecomment-149277205 – igneosaur

ответ

10

Возможно, для вас слишком поздно, но для кого-либо еще; #3095 был обновлен с битным раствора:

var options = { 
    where: { 
    $or: [ 
     { 'subject': { like: '%' + query + '%' } }, 
     { '$Comment.body$': { like: '%' + query + '%' } } 
    ] 
    }, 
    include: [{ model: Comment }] 
}; 

Хитрости заключается в тех знаках доллара, хотя есть still problems с этим решением, когда limit устанавливаются или при запросе с findAndCountAll().

Смежные вопросы