Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 2ce163c3

Von Christian Ehringfeld vor mehr als 9 Jahren hinzugefügt

  • ID 2ce163c308e111ab6db34730e87cb1d7292d74ab
  • Vorgänger b5d490c7
  • Nachfolger 5c3d9487

many_many selection works

Unterschiede anzeigen:

src/entityinstancefactory.cpp
while (iterator != attributes.constEnd()) {
if (metaprops.contains(iterator.key())) {
QMetaProperty prop = metaprops.value(iterator.key());
if (!(prop.isWritable() && prop.write(e, iterator.value()))) {
if(prop.isWritable()) {
if(prop.isEnumType()) {
prop.write(e,prop.enumerator().key(iterator.value().toInt()));
} else {
prop.write(e, iterator.value());
}
} else {
qDebug() << prop.name() << "on Entity" << e->getClassname() << "not writeable!";
}
}
src/entitymanager.cpp
const char *classname, const bool refresh) {
auto ptr = QSharedPointer<Entity>(EntityInstanceFactory::createInstance(
classname, map));
this->resolveRelations(ptr, map, refresh);
this->cache.insert(ptr);
this->resolveRelations(ptr, map, refresh);
return ptr;
}
......
QSharedPointer<Entity> secEntityPtr = QSharedPointer<Entity>(secEntity);
QString tblName = builder->generateManyToManyTableName(entity,
secEntityPtr);
/**
* maybe it would be better, to fetch first the ids, look up cache and then request missing entities
* with this it would be also possible to respect cascade type
*/
if (this->schema->getTables().contains(tblName)) {
QSqlQuery q = builder->manyToMany(tblName,
builder->generateManyToManyColumnName(entity),
entity->getProperty(entity->getPrimaryKey()).toLongLong(),
builder->generateManyToManyColumnName(secEntityPtr),
secEntityPtr->getTablename());
entity->getProperty(entity->getPrimaryKey()).toLongLong());
auto listMap = this->convertQueryResult(q);
auto entities = this->convert(listMap, entity->getClassname(), refresh);
auto entities = QList<QSharedPointer<Entity> >();
for (int var = 0; var < listMap.size(); ++var) {
auto id = listMap.at(var).value(builder->generateManyToManyColumnName(
secEntityPtr));
if (!refresh
&& this->cache.contains(id.toLongLong(), secEntityPtr->getClassname())) {
entities.append(this->cache.get(id.toLongLong(), secEntityPtr->getClassname()));
} else {
entities.append(this->findById(id.toLongLong(), secEntityPtr->getClassname()));
}
}
this->setListProperty(entity, entities, property);
} else {
qDebug() << "MANY_TO_MANY Table " << tblName << " not exists";
......
entity->setId(-1);
rc = false;
} else {
this->cache.insert(entity);
if (persistRelations) {
this->saveRelations(entity);
}
this->cache.insert(entity);
rc = true;
}
}
src/querybuilder.cpp
QSqlQuery QueryBuilder::manyToMany(const QString &tableName,
const QString &attribute,
const qint64 &id,
const QString &foreignKey, const QString &foreignTable) {
const qint64 &id) {
QSqlQuery q = this->database->getQuery();
QString sql = this->selectBase(QStringList(tableName),
QStringList(foreignTable + ".*")) + " " + this->leftJoin(
foreignTable, tableName,
foreignKey) + " WHERE " + this->schema->quoteColumnName(
attribute) + "=:id;";
QString sql = this->selectBase(QStringList(tableName), QStringList("*"));
sql += " WHERE ";
sql += this->schema->quoteColumnName(
attribute);
sql += " = :id;";
q.prepare(sql);
q.bindValue(":id", QVariant(id));
q.bindValue(":id", id);
return q;
}
src/querybuilder.h
const qint64 &id,
const qint64 &limit = 0);
QSqlQuery manyToMany(const QString &tableName, const QString &attribute,
const qint64 &id,
const QString &foreignKey,
const QString &foreignTable);
const qint64 &id);
QSqlQuery manyToManyDelete(const QString &tableName, const QString &attribute,
const qint64 &id);
QSqlQuery manyToManyInsert(const QString &tableName, const QString &col1,

Auch abrufbar als: Unified diff