78 lines
2.1 KiB
C++
78 lines
2.1 KiB
C++
#include "movies_model.h"
|
|
|
|
#include <QSqlError>
|
|
#include <QSqlQuery>
|
|
|
|
MoviesModel::MoviesModel(QObject *parent, const QSqlDatabase &database)
|
|
: BaseSqlTableModel(parent, database) {}
|
|
|
|
void MoviesModel::initialize() {
|
|
setTable("movies");
|
|
|
|
// Set up the relationship with the genres table
|
|
setRelation(fieldIndex("genre_id"),
|
|
QSqlRelation("genres", "genre_id", "genre_name"));
|
|
|
|
setEditStrategy(QSqlTableModel::OnFieldChange);
|
|
|
|
bool success = select();
|
|
if (!success) {
|
|
qWarning() << "Error:" << lastError().text();
|
|
}
|
|
}
|
|
|
|
QVariant MoviesModel::headerData(int section, Qt::Orientation orientation,
|
|
int role) const {
|
|
if (role == Qt::DisplayRole && orientation == Qt::Horizontal) {
|
|
switch (section) {
|
|
case MoviesColumns::Id:
|
|
return tr("ID");
|
|
case MoviesColumns::Title:
|
|
return tr("Title");
|
|
case MoviesColumns::GenreId:
|
|
return tr("Genre");
|
|
case MoviesColumns::Duration:
|
|
return tr("Duration");
|
|
default:
|
|
return QVariant();
|
|
}
|
|
}
|
|
return QSqlRelationalTableModel::headerData(section, orientation, role);
|
|
}
|
|
|
|
bool MoviesModel::buildGenreIdFilterCondition(const QString &inFilter,
|
|
QString &outFilter) const {
|
|
QSqlQuery query;
|
|
query.prepare("SELECT genre_id FROM genres WHERE genre_name LIKE ?");
|
|
query.addBindValue("%" + inFilter + "%");
|
|
query.exec();
|
|
|
|
QStringList genreIds;
|
|
while (query.next()) {
|
|
genreIds << query.value(0).toString();
|
|
}
|
|
|
|
outFilter = QString("movies.genre_id IN (%1)").arg(genreIds.join(", "));
|
|
|
|
return true;
|
|
}
|
|
|
|
QString MoviesModel::createMultiColumnFilter(const QString &filter) const {
|
|
QStringList conditions;
|
|
|
|
QString buffer; // MoviesColumns::GenreId
|
|
if (buildGenreIdFilterCondition(filter, buffer)) {
|
|
conditions.append(buffer);
|
|
}
|
|
|
|
using Columns = MoviesColumns;
|
|
QStringList columns = {columnName(Columns::Id), columnName(Columns::Title),
|
|
columnName(Columns::Duration)};
|
|
|
|
for (const QString &column : columns) {
|
|
conditions.append(QString("%1 LIKE '%%2%'").arg(column).arg(filter));
|
|
}
|
|
|
|
return conditions.join(" OR ");
|
|
}
|