- Work done on Join and using the @Relation annotation in case there is no join.
- Added some field type (date, Datetime, Time) - Added a new @Filter annotation which allows to filter repository from relation into a method.
This commit is contained in:
1 parent
65de1dd849
commit
e465ecdf32
17 files changed
+197
-61
No files matched your search
+42
-10
@@ -2,6 +2,7 @@
|
||||
|
||||
namespace Ulmus;
|
||||
|
||||
use Ulmus\Annotation\Property\{ Where, Having, Relation, Join };
|
||||
use Ulmus\Common\EntityResolver;
|
||||
|
||||
class Repository
|
||||
@@ -145,7 +146,7 @@ class Repository
|
||||
$pkField = key($primaryKeyDefinition);
|
||||
$dataset[$pkField] = $statement->lastInsertId;
|
||||
}
|
||||
|
||||
|
||||
$entity->entityFillFromDataset($dataset, true);
|
||||
}
|
||||
else {
|
||||
@@ -161,7 +162,7 @@ class Repository
|
||||
$update = $this->updateSqlQuery($diff)->runQuery();
|
||||
|
||||
$entity->entityFillFromDataset($dataset);
|
||||
|
||||
|
||||
return $update ? (bool) $update->rowCount() : false;
|
||||
}
|
||||
}
|
||||
@@ -378,7 +379,6 @@ class Repository
|
||||
|
||||
return $this->where($primaryKeyField[$pkField]->name ?? $pkField, $value);
|
||||
}
|
||||
|
||||
|
||||
public function withJoin(/*string|array*/ $fields) : self
|
||||
{
|
||||
@@ -386,20 +386,53 @@ class Repository
|
||||
$this->select("{$this->alias}.*");
|
||||
}
|
||||
|
||||
# Apply FILTER annotation to this too !
|
||||
foreach((array) $fields as $item) {
|
||||
if ( null !== $join = $this->entityResolver->searchFieldAnnotation($item, new Annotation\Property\Join) ) {
|
||||
$alias = $join->alias ?? $item;
|
||||
$annotation = $this->entityResolver->searchFieldAnnotation($item, new Join) ?:
|
||||
$this->entityResolver->searchFieldAnnotation($item, new Relation);
|
||||
|
||||
$entity = $join->entity ?? $this->entityResolver->properties[$item]['type'];
|
||||
if (( $annotation instanceof Relation ) && ( $annotation->normalizeType() === 'manytomany' )) {
|
||||
throw new Exception("Many-to-many relation can not be preloaded within joins.");
|
||||
}
|
||||
|
||||
if ( $annotation ) {
|
||||
$alias = $annotation->alias ?? $item;
|
||||
|
||||
$entity = $annotation->entity ?? $this->entityResolver->properties[$item]['type'];
|
||||
|
||||
foreach($entity::resolveEntity()->fieldList(Common\EntityResolver::KEY_COLUMN_NAME, true) as $key => $field) {
|
||||
$this->select("$alias.$key as {$alias}\${$field['name']}");
|
||||
}
|
||||
|
||||
$key = is_string($join->key) ? $this->entityClass::field($join->key) : $join->key;
|
||||
$foreignKey = is_string($join->foreignKey) ? $entity::field($join->foreignKey, $alias) : $join->foreignKey;
|
||||
$this->open();
|
||||
|
||||
$this->join($join->type, $entity::resolveEntity()->tableName(), $key, $foreignKey, $alias);
|
||||
foreach($this->entityResolver->searchFieldAnnotationList($item, new Where() ) as $condition) {
|
||||
if ( is_object($condition->field) && ( $condition->field->entityClass !== $entity ) ) {
|
||||
$this->where(is_object($condition->field) ? $condition->field : $entity::field($condition->field), $condition->value, $condition->operator);
|
||||
}
|
||||
}
|
||||
|
||||
foreach($this->entityResolver->searchFieldAnnotationList($item, new Having() ) as $condition) {
|
||||
$this->having(is_object($condition->field) ? $condition->field : $entity::field($condition->field), $condition->value, $condition->operator);
|
||||
}
|
||||
|
||||
$this->close();
|
||||
|
||||
$key = is_string($annotation->key) ? $this->entityClass::field($annotation->key) : $annotation->key;
|
||||
|
||||
$foreignKey = is_string($annotation->foreignKey) ? $entity::field($annotation->foreignKey, $alias) : $annotation->foreignKey;
|
||||
|
||||
$this->join("LEFT", $entity::resolveEntity()->tableName(), $key, $foreignKey, $alias, function($join) use ($item, $entity, $alias) {
|
||||
foreach($this->entityResolver->searchFieldAnnotationList($item, new Where() ) as $condition) {
|
||||
$field = clone $condition->field;
|
||||
|
||||
if ( is_object($condition->field) && ( $condition->field->entityClass === $entity ) ) {
|
||||
$field->alias = $alias;
|
||||
|
||||
$join->where(is_object($field) ? $field : $entity::field($field, $alias), $condition->value, $condition->operator);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
throw new \Exception("You referenced field `$item` which do not exist or do not contain a valid @Join annotation.");
|
||||
@@ -409,7 +442,6 @@ class Repository
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
public function filterServerRequest(SearchRequest\SearchRequestInterface $searchRequest) : self
|
||||
{
|
||||
$searchRequest->count = $searchRequest->filter( clone $this )
|
||||
|
||||
Reference in new issue
Block a user