This commit is contained in:
Hamed Masafi 2018-01-09 21:02:28 +03:30
parent ef5f238fed
commit e45860eb59
6 changed files with 56 additions and 4 deletions

View File

@ -33,6 +33,18 @@
NUT_BEGIN_NAMESPACE NUT_BEGIN_NAMESPACE
/*
* Index:
* ALTER TABLE `travelLog` ADD INDEX(`driverId`);
*
* Foreign key:
* ALTER TABLE `travelLog`
* ADD CONSTRAINT `travelLog_ibfk_1`
* FOREIGN KEY (`driverId`)
* REFERENCES `account` (`id`)
* ON DELETE CASCADE
* ON UPDATE CASCADE;
*/
SqlGeneratorBase::SqlGeneratorBase(Database *parent) SqlGeneratorBase::SqlGeneratorBase(Database *parent)
: QObject((QObject *)parent) : QObject((QObject *)parent)
{ {
@ -50,6 +62,11 @@ QString SqlGeneratorBase::masterDatabaseName(QString databaseName)
return ""; return "";
} }
QString SqlGeneratorBase::createTable(TableModel *table)
{
}
QString SqlGeneratorBase::saveRecord(Table *t, QString tableName) QString SqlGeneratorBase::saveRecord(Table *t, QString tableName)
{ {
Q_ASSERT(!tableName.isEmpty() && !tableName.isNull()); Q_ASSERT(!tableName.isEmpty() && !tableName.isNull());
@ -161,6 +178,32 @@ QString SqlGeneratorBase::diff(TableModel *oldTable, TableModel *newTable)
return sql; return sql;
} }
QString SqlGeneratorBase::join(const QStringList &list)
{
if (!list.count())
return "";
if (list.count() == 1)
return list.first();
DatabaseModel model = _database->model();
QStringList clone = list;
QString mainTable = clone.takeFirst();
QString ret = mainTable;
do {
QString t = model.tableByClassName(clone.first())->name();
RelationModel *rel = model.relationByTableNames(mainTable, t);
if (rel) {
clone.takeFirst();
ret.append(", " + _database->tableName(clone.takeFirst()));
}
} while (clone.count());
return ret;
}
QString SqlGeneratorBase::insertRecord(Table *t, QString tableName) QString SqlGeneratorBase::insertRecord(Table *t, QString tableName)
{ {
QString sql = ""; QString sql = "";

View File

@ -59,6 +59,8 @@ public:
virtual QString masterDatabaseName(QString databaseName); virtual QString masterDatabaseName(QString databaseName);
virtual QString createTable(TableModel *table);
virtual QString fieldType(FieldModel *field) = 0; virtual QString fieldType(FieldModel *field) = 0;
virtual QString fieldDeclare(FieldModel *field); virtual QString fieldDeclare(FieldModel *field);
@ -66,6 +68,8 @@ public:
virtual QString diff(FieldModel *oldField, FieldModel *newField); virtual QString diff(FieldModel *oldField, FieldModel *newField);
virtual QString diff(TableModel *oldTable, TableModel *newTable); virtual QString diff(TableModel *oldTable, TableModel *newTable);
virtual QString join(const QStringList &list);
virtual QString saveRecord(Table *t, QString tableName); virtual QString saveRecord(Table *t, QString tableName);
virtual QString insertRecord(Table *t, QString tableName); virtual QString insertRecord(Table *t, QString tableName);
virtual QString updateRecord(Table *t, QString tableName); virtual QString updateRecord(Table *t, QString tableName);

View File

@ -53,7 +53,7 @@ public:
//ddl //ddl
Query<T> *setWhere(WherePhrase where); Query<T> *setWhere(WherePhrase where);
Query<T> *join(const QString &tableName); Query<T> *join(const QString &className);
Query<T> *join(Table *c); Query<T> *join(Table *c);
template<class TABLE> template<class TABLE>
@ -125,6 +125,8 @@ Q_OUTOFLINE_TEMPLATE QList<T *> Query<T>::toList(int count)
QList<T*> result; QList<T*> result;
d->select = "*"; d->select = "*";
d->joins.prepend(d->tableName);
qDebug() << "JOINS="<< d->database->sqlGenertor()->join(d->joins);
// QSqlQuery q = // QSqlQuery q =
// d->database->exec(d->database->sqlGenertor()->selectCommand(d->wheres, // d->database->exec(d->database->sqlGenertor()->selectCommand(d->wheres,
// d->orders, d->tableName, d->joinClassName)); // d->orders, d->tableName, d->joinClassName));
@ -316,10 +318,11 @@ Q_OUTOFLINE_TEMPLATE QVariant Query<T>::average(FieldPhrase<int> &f)
} }
template <class T> template <class T>
Q_OUTOFLINE_TEMPLATE Query<T> *Query<T>::join(const QString &tableName) Q_OUTOFLINE_TEMPLATE Query<T> *Query<T>::join(const QString &className)
{ {
Q_D(Query); Q_D(Query);
d->joinClassName = tableName; d->joinClassName = className;
d->joins.append(className);
return this; return this;
} }

View File

@ -46,6 +46,7 @@ public:
Database *database; Database *database;
TableSetBase *tableSet; TableSetBase *tableSet;
QString joinClassName; QString joinClassName;
QStringList joins;
QList<WherePhrase> wheres; QList<WherePhrase> wheres;
QList<WherePhrase> orderPhrases; QList<WherePhrase> orderPhrases;
QHash<QString, QString> orders; QHash<QString, QString> orders;

View File

@ -98,6 +98,7 @@ void MainTest::selectPosts()
auto q = db.posts()->query() auto q = db.posts()->query()
// q->join(Post::commentsTable()); // q->join(Post::commentsTable());
// q->join(Post::commentsTable()); // q->join(Post::commentsTable());
->join<User>()
->join<Comment>() ->join<Comment>()
->orderBy(!Post::saveDateField() & Post::bodyField()) ->orderBy(!Post::saveDateField() & Post::bodyField())
->setWhere(Post::idField() == postId); ->setWhere(Post::idField() == postId);

View File

@ -29,7 +29,7 @@ class Post : public Table
NUT_DECLARE_CHILD_TABLE(Comment, comments) NUT_DECLARE_CHILD_TABLE(Comment, comments)
public: public:
explicit Post(QObject *tableSet = 0); Q_INVOKABLE Post(QObject *tableSet = 0);
signals: signals: