#include "movies_model.h" #include #include 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 "); }