- Some bugfixes were made, added a new diff before saving results. Also, a new method was added for insert, update and delete respectively for other drivers to override as needed

This commit is contained in:
Dave Mc Nicoll committed 2021-10-19 12:41:04 +00:00
1 parent 58afe841e7
commit dc5e088551
7 files changed
+111 -29

No files matched your search

+50 -8
View File
@@ -56,6 +56,11 @@ class Repository
return $this->collectionFromQuery();
}
public function loadAllFromField($field, $value) : EntityCollection
{
return $this->loadFromField($field, $value);
}
public function loadFromField($field, $value) : EntityCollection
{
return $this->where($field, $value)->collectionFromQuery();
@@ -81,12 +86,12 @@ class Repository
public function deleteOne()
{
return $this->limit(1)->deleteSqlQuery()->runQuery();
return $this->limit(1)->deleteSqlQuery()->runDeleteQuery();
}
public function deleteAll()
{
return $this->deleteSqlQuery()->runQuery();
return $this->deleteSqlQuery()->runDeleteQuery();
}
public function deleteFromPk($value) : bool
@@ -140,7 +145,7 @@ class Repository
$primaryKeyDefinition = Ulmus::resolveEntity($this->entityClass)->getPrimaryKeyField();
if ( ! $entity->isLoaded() ) {
$statement = $this->insertSqlQuery($fieldsAndValue ?? $dataset, $replace)->runQuery();
$statement = $this->insertSqlQuery($fieldsAndValue ?? $dataset, $replace)->runInsertQuery();
if ( ( 0 !== $statement->lastInsertId ) &&
( null !== $primaryKeyDefinition )) {
@@ -156,16 +161,16 @@ class Repository
throw new \Exception(sprintf("No primary key found for entity %s", $this->entityClass));
}
$diff = $fieldsAndValue ?? $this->generateDatasetDiff($entity);
$diff = $fieldsAndValue ?? $this->generateWritableDataset($entity);
if ( [] !== $diff ) {
$pkField = key($primaryKeyDefinition);
$pkFieldName = $primaryKeyDefinition[$pkField]->name ?? $pkField;
$this->where($pkFieldName, $dataset[$pkFieldName]);
$update = $this->updateSqlQuery($diff)->runQuery();
$update = $this->updateSqlQuery($diff)->runUpdateQuery();
$entity->entityFillFromDataset($dataset);
$entity->entityFillFromDataset($dataset, true);
return $update ? (bool) $update->rowCount() : false;
}
@@ -220,6 +225,22 @@ class Repository
return array_diff_assoc($oldValues ? $dataset : $array , $oldValues ? $array : $dataset );
}
public function generateWritableDataset(object $entity, bool $oldValues = false) : array
{
$intersect = [];
$dataset = $this->generateDatasetDiff($entity, $oldValues);
foreach($dataset as $field => $value) {
if ( false === ( $this->entityResolver->searchFieldAnnotation($field, new Field, false)->readonly ?? false ) ) {
$intersect[$field] = $field;
}
}
return array_intersect_key($dataset, $intersect);
}
public function yield() : \Generator
{
$class = $this->entityClass;
@@ -482,7 +503,7 @@ class Repository
}
foreach($this->entityResolver->searchFieldAnnotationList($item, new Filter() ) as $filter) {
call_user_func_array([ $this->entityClass, $filter->method ], [ $this, $item ]);
call_user_func_array([ $this->entityClass, $filter->method ], [ $this, $item, true ]);
}
$this->close();
@@ -508,7 +529,7 @@ class Repository
}
foreach($this->entityResolver->searchFieldAnnotationList($item, new FilterJoin() ) as $filter) {
call_user_func_array([ $this->entityClass, $filter->method ], [ $join, $item ]);
call_user_func_array([ $this->entityClass, $filter->method ], [ $join, $item, true ]);
}
});
}
@@ -617,6 +638,27 @@ class Repository
return Ulmus::runQuery($this->queryBuilder, $this->adapter);
}
public function runInsertQuery() /* : mixed */
{
$this->finalizeQuery();
return Ulmus::runInsertQuery($this->queryBuilder, $this->adapter);
}
public function runUpdateQuery() /* : mixed */
{
$this->finalizeQuery();
return Ulmus::runUpdateQuery($this->queryBuilder, $this->adapter);
}
public function runDeleteQuery() /* : mixed */
{
$this->finalizeQuery();
return Ulmus::runDeleteQuery($this->queryBuilder, $this->adapter);
}
public function resetQuery() : self
{
$this->queryBuilder->reset();