1#ifndef QELOQUENT_MODELHELPERS_H
2#define QELOQUENT_MODELHELPERS_H
4#include <QEloquent/model.h>
5#include <QEloquent/metaobject.h>
6#include <QEloquent/query.h>
7#include <QEloquent/error.h>
8#include <QEloquent/connection.h>
9#include <QEloquent/querybuilder.h>
10#include <QEloquent/queryrunner.h>
16#define QELOQUENT_HELPERS(Class) \
18 using QEloquent::ModelHelpers<Class>::make; \
19 using QEloquent::ModelHelpers<Class>::find; \
20 using QEloquent::ModelHelpers<Class>::paginate; \
21 using QEloquent::ModelHelpers<Class>::all; \
22 using QEloquent::ModelHelpers<Class>::count; \
23 using QEloquent::ModelHelpers<Class>::create; \
24 using QEloquent::ModelHelpers<Class>::remove; \
25 using QEloquent::ModelHelpers<Class>::query; \
26 using QEloquent::ModelHelpers<Class>::fixQuery; \
35template<
typename Model>
41 static MetaObject
metaObject() {
return MetaObject::fromQtMetaObject(Model::staticMetaObject); }
55template<
typename Model,
typename Maker = ModelMaker<Model>>
60 static Model make(
const QJsonObject &
object = QJsonObject());
62 static QList<Model>
make(
const QList<QJsonObject> &objects);
65 static Result<Model, Error>
find(
const QVariant &primary);
79 static Result<Model, Error>
create(
const QJsonObject &
object);
81 static Result<QList<Model>,
Error>
create(
const QList<QJsonObject> &objects);
94template<
typename Model,
typename Maker>
97 Model m = Maker::make();
102template<
typename Model,
typename Maker>
106 for (
const QJsonObject &
object : objects) {
107 Model m = Maker::make();
114template<
typename Model,
typename Maker>
118 query.where(Maker::metaObject().primaryProperty().fieldName(), primary);
121 Result<QList<Model>,
Error> result = find(query);
123 const QList<Model> models = result.value();
124 return (models.isEmpty() ? Maker::make() : models.first());
126 return failWith(result.error());
130template<
typename Model,
typename Maker>
133 const MetaObject metaObject = Maker::metaObject();
134 const QString statement = QueryBuilder::selectStatement(fixQuery(query, metaObject));
136 auto result = QueryRunner::exec(statement, query.
connectionName());
140 QStringList relations = metaObject.relations() + query.
relations();
141 relations.removeDuplicates();
143 while (result->next()) {
144 Model m = Maker::make();
145 m.fill(result->record());
146 if (m.
load(relations))
158template<
typename Model,
typename Maker>
161 return find(query.
page(page, itemsPerPage));
164template<
typename Model,
typename Maker>
170template<
typename Model,
typename Maker>
173 const QString statement = QueryBuilder::selectStatement(
"COUNT(1)", fixQuery(query));
175 auto result = QueryRunner::exec(statement, query.
connectionName());
177 return (result->next() ? result->value(0).toInt() : 0);
182template<
typename Model,
typename Maker>
185 Model model = Maker::make();
193template<
typename Model,
typename Maker>
198 for (
const QJsonObject &
object : objects) {
199 auto result = create(
object);
201 models.append(result.value());
203 return failWith(result.error());
209template<
typename Model,
typename Maker>
212 const QString statement = QueryBuilder::deleteStatement(fixQuery(query));
214 auto result = QueryRunner::exec(statement, query.
connectionName());
216 return result->numRowsAffected();
218 return failWith(
Error(Error::DatabaseError, QString(), result.error()));
221template<
typename Model,
typename Maker>
225 return fixQuery(query, Maker::metaObject());
228template<
typename Model,
typename Maker>
231 return fixQuery(query, Maker::metaObject());
234template<
typename Model,
typename Maker>
238 .
table(metaObject.tableName())
Represents an error in a database operation.
Definition error.h:16
static Error fromSqlError(const QSqlError &error)
Creates an Error object from a QSqlError.
Definition error.cpp:128
Provides static CRUD and query helpers for Model types.
Definition modelhelpers.h:57
static Result< Model, Error > find(const QVariant &primary)
Finds a model by its primary key.
Definition modelhelpers.h:115
static Result< QList< Model >, Error > all(Query query=Query())
Finds all models, optionaly matching the given query.
Definition modelhelpers.h:165
static Result< int, Error > count(Query query=Query())
Returns the number of records matching the query.
Definition modelhelpers.h:171
static Model make(const QJsonObject &object=QJsonObject())
Creates a model instance with optional JSON data.
Definition modelhelpers.h:95
static Query & fixQuery(Query &query)
Configures a Query object for this model's table and connection.
Definition modelhelpers.h:229
static Result< Model, Error > create(const QJsonObject &object)
Creates and persists a new model from JSON data.
Definition modelhelpers.h:183
static Result< QList< Model >, Error > paginate(int page=1, int itemsPerPage=20, Query query=Query())
Finds models matching the given query and limit output using pagination.
Definition modelhelpers.h:159
static Query query()
Returns a new Query object initialized for this model's table.
Definition modelhelpers.h:222
static Result< int, Error > remove(Query query)
Deletes records matching the given query.
Definition modelhelpers.h:210
Internal helper to create model instances and access metadata.
Definition modelhelpers.h:36
static Model make()
Creates a default model instance.
Definition modelhelpers.h:39
static MetaObject metaObject()
Returns the MetaObject for the model type.
Definition modelhelpers.h:41
The Model class is the base class for all ORM models.
Definition model.h:31
Error lastError() const
Returns the last error encountered by this model.
Definition model.cpp:314
bool load(const QString &relation)
Eagerly loads a relationship.
Definition model.cpp:274
Fluent SQL query builder.
Definition query.h:15
Query & limit(int limit)
Adds a LIMIT clause.
Definition query.cpp:252
Query & page(int page, int countPerPage=20)
Configures pagination (LIMIT/OFFSET).
Definition query.cpp:238
QStringList relations() const
Returns the list of relations to be eager loaded.
Definition query.cpp:528
QString connectionName() const
Returns the name of the connection.
Definition query.cpp:296
Connection connection() const
Returns the connection used by this query.
Definition query.cpp:288
Query & table(const QString &tableName)
Configures the table name for the query.
Definition query.cpp:125