2019-08-21 20:13:00 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Ulmus;
|
|
|
|
|
|
|
|
use Ulmus\Common\EntityResolver;
|
|
|
|
|
|
|
|
class Repository
|
|
|
|
{
|
|
|
|
const DEFAULT_ALIAS = "this";
|
|
|
|
|
2020-04-09 17:20:07 +00:00
|
|
|
public ? ConnectionAdapter $adapter;
|
2019-08-21 20:13:00 +00:00
|
|
|
|
|
|
|
protected QueryBuilder $queryBuilder;
|
|
|
|
|
|
|
|
protected EntityResolver $entityResolver;
|
|
|
|
|
|
|
|
public string $alias;
|
|
|
|
|
|
|
|
public string $entityClass;
|
|
|
|
|
|
|
|
public function __construct(string $entity, string $alias = self::DEFAULT_ALIAS, ConnectionAdapter $adapter = null) {
|
|
|
|
$this->entityClass = $entity;
|
|
|
|
$this->alias = $alias;
|
|
|
|
$this->entityResolver = Ulmus::resolveEntity($entity);
|
2020-02-13 03:56:53 +00:00
|
|
|
$this->adapter = $adapter ?? $this->entityResolver->databaseAdapter() ?? Ulmus::$defaultAdapter;
|
|
|
|
$this->queryBuilder = new QueryBuilder( $this->adapter->adapter() );
|
2019-08-21 20:13:00 +00:00
|
|
|
}
|
|
|
|
|
2020-01-31 21:38:48 +00:00
|
|
|
public function loadOne() : ? object
|
2019-08-21 20:13:00 +00:00
|
|
|
{
|
2020-01-31 21:38:48 +00:00
|
|
|
return $this->limit(1)->collectionFromQuery()[0] ?? null;
|
2019-08-21 20:13:00 +00:00
|
|
|
}
|
|
|
|
|
2020-02-17 13:23:41 +00:00
|
|
|
public function loadOneFromField($field, $value) : ? object
|
|
|
|
{
|
|
|
|
return $this->where($field, $value)->loadOne();
|
|
|
|
}
|
|
|
|
|
2020-01-31 21:38:48 +00:00
|
|
|
public function loadFromPk($value, $primaryKey = "id") : ? object
|
2019-08-21 20:13:00 +00:00
|
|
|
{
|
2020-02-17 13:23:41 +00:00
|
|
|
return $this->loadOneFromField($primaryKey, $value);
|
2019-08-21 20:13:00 +00:00
|
|
|
}
|
2020-01-31 21:38:48 +00:00
|
|
|
|
|
|
|
public function loadAll() : EntityCollection
|
2019-08-21 20:13:00 +00:00
|
|
|
{
|
2020-01-31 21:38:48 +00:00
|
|
|
return $this->collectionFromQuery();
|
2019-08-21 20:13:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
public function loadFromField($field, $value) : EntityCollection
|
|
|
|
{
|
|
|
|
return $this->where($field, $value)->collectionFromQuery();
|
|
|
|
}
|
2020-02-01 03:01:56 +00:00
|
|
|
|
|
|
|
public function count() : int
|
|
|
|
{
|
2020-04-09 13:50:09 +00:00
|
|
|
$this->select("COUNT(*)")->selectSqlQuery();
|
2020-02-07 21:36:38 +00:00
|
|
|
|
|
|
|
$this->finalizeQuery();
|
2020-02-01 03:01:56 +00:00
|
|
|
|
2020-04-09 13:50:09 +00:00
|
|
|
return Ulmus::runSelectQuery($this->queryBuilder, $this->adapter)->fetchColumn(0);
|
2020-02-01 03:01:56 +00:00
|
|
|
}
|
2019-08-21 20:13:00 +00:00
|
|
|
|
2019-12-19 14:54:33 +00:00
|
|
|
public function deleteOne()
|
2020-02-07 21:36:38 +00:00
|
|
|
{
|
2019-12-19 14:54:33 +00:00
|
|
|
return $this->limit(1)->deleteSqlQuery()->runQuery();
|
|
|
|
}
|
|
|
|
|
|
|
|
public function deleteAll()
|
|
|
|
{
|
|
|
|
return $this->deleteSqlQuery()->runQuery();
|
|
|
|
}
|
|
|
|
|
2020-02-07 21:36:38 +00:00
|
|
|
public function deleteFromPk($value) : bool
|
2020-02-06 04:41:57 +00:00
|
|
|
{
|
2020-02-07 21:36:38 +00:00
|
|
|
if ( $value !== 0 && empty($value) ) {
|
|
|
|
throw new Exception\EntityPrimaryKeyUnknown("A primary key value has to be defined to delete an item.");
|
|
|
|
}
|
|
|
|
|
|
|
|
return (bool) $this->wherePrimaryKey($value)->deleteOne()->rowCount();
|
2019-12-19 14:54:33 +00:00
|
|
|
}
|
|
|
|
|
2020-01-31 21:38:48 +00:00
|
|
|
public function save(object $entity) : bool
|
2020-02-06 04:41:57 +00:00
|
|
|
{
|
2020-02-05 21:19:57 +00:00
|
|
|
$dataset = $entity->toArray();
|
2020-02-07 21:36:38 +00:00
|
|
|
|
2020-02-06 04:41:57 +00:00
|
|
|
$primaryKeyDefinition = Ulmus::resolveEntity($this->entityClass)->getPrimaryKeyField();
|
|
|
|
|
2020-02-05 21:19:57 +00:00
|
|
|
if ( ! $entity->isLoaded() ) {
|
2020-02-06 04:41:57 +00:00
|
|
|
$statement = $this->insertSqlQuery($dataset)->runQuery();
|
|
|
|
|
|
|
|
if ( ( 0 !== $statement->lastInsertId ) &&
|
|
|
|
( null !== $primaryKeyDefinition )) {
|
|
|
|
$pkField = key($primaryKeyDefinition);
|
|
|
|
$entity->$pkField = $statement->lastInsertId;
|
|
|
|
}
|
2020-02-07 21:36:38 +00:00
|
|
|
|
|
|
|
return true;
|
2020-02-05 21:19:57 +00:00
|
|
|
}
|
|
|
|
else {
|
2020-02-07 21:36:38 +00:00
|
|
|
if ( $primaryKeyDefinition === null ) {
|
2020-02-06 04:41:57 +00:00
|
|
|
throw new \Exception(sprintf("No primary key found for entity %s", $this->entityClass));
|
|
|
|
}
|
2020-02-17 13:23:41 +00:00
|
|
|
|
2020-03-19 13:55:00 +00:00
|
|
|
if ( [] !== $diff = $this->generateDatasetDiff($entity) ) {
|
2020-02-17 13:23:41 +00:00
|
|
|
$pkField = key($primaryKeyDefinition);
|
|
|
|
$pkFieldName = $primaryKeyDefinition[$pkField]->name ?? $pkField;
|
|
|
|
$this->where($pkFieldName, $dataset[$pkFieldName]);
|
|
|
|
|
2020-02-07 21:36:38 +00:00
|
|
|
$update = $this->updateSqlQuery($diff)->runQuery();
|
|
|
|
|
2020-02-17 13:23:41 +00:00
|
|
|
return $update ? (bool) $update->rowCount() : false;
|
|
|
|
}
|
2020-02-05 21:19:57 +00:00
|
|
|
}
|
2020-01-31 21:38:48 +00:00
|
|
|
|
2020-02-05 21:19:57 +00:00
|
|
|
return false;
|
2020-01-31 21:38:48 +00:00
|
|
|
}
|
|
|
|
|
2020-02-17 13:23:41 +00:00
|
|
|
public function saveAll(EntityCollection $collection) : void
|
2020-01-31 21:38:48 +00:00
|
|
|
{
|
2020-02-05 21:19:57 +00:00
|
|
|
foreach($collection as $entity) {
|
|
|
|
$this->save($entity);
|
|
|
|
}
|
2020-01-31 21:38:48 +00:00
|
|
|
}
|
|
|
|
|
2020-03-19 13:55:00 +00:00
|
|
|
public function generateDatasetDiff(object $entity) : array
|
|
|
|
{
|
|
|
|
return array_diff_assoc( array_change_key_case($entity->toArray()), array_change_key_case($entity->entityGetDataset(true)) );
|
|
|
|
}
|
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
public function yieldAll() : \Generator
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public function select($fields) : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->select($fields);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-02-05 21:19:57 +00:00
|
|
|
public function insert(array $fieldlist, string $table, string $alias, ? string $schema) : self
|
|
|
|
{
|
2020-04-09 17:20:07 +00:00
|
|
|
$this->queryBuilder->insert($fieldlist, $this->escapeTable($table), $alias, $schema);
|
2020-02-05 21:19:57 +00:00
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function values(array $dataset) : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->values($dataset);
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-04-09 13:50:09 +00:00
|
|
|
public function update(string $table, string $alias, ? string $schema) : self
|
2020-02-06 04:41:57 +00:00
|
|
|
{
|
2020-04-09 17:20:07 +00:00
|
|
|
$this->queryBuilder->update($this->escapeTable($table), $alias, $schema);
|
2020-02-06 04:41:57 +00:00
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function set(array $dataset) : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->set($dataset);
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2019-12-19 14:54:33 +00:00
|
|
|
public function delete() : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->delete($this->alias);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-12-19 14:54:33 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-02-07 21:36:38 +00:00
|
|
|
public function from(string $table, ? string $alias, ? string $schema) : self
|
2019-08-21 20:13:00 +00:00
|
|
|
{
|
2020-04-09 17:20:07 +00:00
|
|
|
$this->queryBuilder->from($this->escapeTable($table), $alias, $this->escapeDatabase($this->adapter->adapter()->database), $schema ? $this->escapeSchema($schema) : null);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function join(string $type, $table, $field, $value) : self
|
|
|
|
{
|
2020-04-09 17:20:07 +00:00
|
|
|
$this->queryBuilder->join($type, $this->escapeTable($table), $field, $value);
|
2020-02-17 13:23:41 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function open(string $condition = Query\Where::CONDITION_AND) : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->open($condition);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function orOpen() : self
|
|
|
|
{
|
|
|
|
return $this->open(Query\Where::CONDITION_OR);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function close() : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->close();
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function where($field, $value, string $operator = Query\Where::OPERATOR_EQUAL) : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->where($field, $value, $operator, Query\Where::CONDITION_AND);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-03-29 02:13:29 +00:00
|
|
|
public function wheres(array $fieldValues, string $operator = Query\Where::OPERATOR_EQUAL) : self
|
|
|
|
{
|
|
|
|
foreach($fieldValues as $field => $value) {
|
2020-03-31 17:24:15 +00:00
|
|
|
if ( is_array($value) ) {
|
|
|
|
switch ($value[1]) {
|
|
|
|
case Query\Where::CONDITION_AND:
|
|
|
|
$this->where($field, $value[0], $operator);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Query\Where::CONDITION_OR:
|
|
|
|
$this->or($field, $value[0], $operator);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Query\Where::CONDITION_NOT:
|
|
|
|
$this->notWhere($field, $value[0], $operator);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$this->where($field, $value, $operator);
|
|
|
|
}
|
2020-03-29 02:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
public function and($field, $value, string $operator = Query\Where::OPERATOR_EQUAL) : self
|
|
|
|
{
|
|
|
|
return $this->where($field, $value, $operator);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function or($field, $value, string $operator = Query\Where::OPERATOR_EQUAL) : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->where($field, $value, $operator, Query\Where::CONDITION_OR);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-02-06 04:41:57 +00:00
|
|
|
public function notWhere($field, $value, string $operator = Query\Where::OPERATOR_NOT_EQUAL) : self
|
2019-08-21 20:13:00 +00:00
|
|
|
{
|
|
|
|
$this->queryBuilder->where($field, $value, $operator, Query\Where::CONDITION_AND, true);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-03-29 02:13:29 +00:00
|
|
|
public function orNot($field, $value, string $operator = Query\Where::OPERATOR_NOT_EQUAL) : self
|
2019-08-21 20:13:00 +00:00
|
|
|
{
|
2020-03-29 02:13:29 +00:00
|
|
|
$this->queryBuilder->notWhere($field, $value, $operator, Query\Where::CONDITION_OR, true);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-04-09 13:50:09 +00:00
|
|
|
public function having($field, $value, string $operator = Query\Having::OPERATOR_EQUAL) : self
|
2019-08-21 20:13:00 +00:00
|
|
|
{
|
2020-04-09 13:50:09 +00:00
|
|
|
$this->queryBuilder->having($field, $value, $operator, Query\Having::CONDITION_AND);
|
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-04-09 13:50:09 +00:00
|
|
|
public function orHaving($field, $value, string $operator = Query\Where::OPERATOR_EQUAL) : self
|
2019-08-21 20:13:00 +00:00
|
|
|
{
|
2020-04-09 13:50:09 +00:00
|
|
|
$this->queryBuilder->having($field, $value, $operator, Query\Having::CONDITION_OR);
|
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-04-09 13:50:09 +00:00
|
|
|
public function notHaving($field, $value, string $operator = Query\Where::OPERATOR_NOT_EQUAL) : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->having($field, $value, $operator, Query\Having::CONDITION_AND, true);
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function orNotHaving($field, $value, string $operator = Query\Where::OPERATOR_NOT_EQUAL) : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->having($field, $value, $operator, Query\Having::CONDITION_OR, true);
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
public function in($field, $value, string $operator = Query\Where::OPERATOR_EQUAL) : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->where($field, $value, $operator);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function orIn($field, $value, string $operator = Query\Where::OPERATOR_EQUAL) : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->where($field, $value, $operator, Query\Where::CONDITION_OR);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function notIn($field, $value) : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->where($field, $value, Query\Where::OPERATOR_NOT_EQUAL);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function orNotIn($field, $value, string $operator = Query\Where::OPERATOR_EQUAL) : self
|
|
|
|
{
|
|
|
|
return $this->orNot($field, $value, Query\Where::OPERATOR_NOT_EQUAL, Query\Where::CONDITION_OR);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function like($field, $value) : self
|
|
|
|
{
|
2020-03-31 17:24:15 +00:00
|
|
|
$this->where($field, $value, Query\Where::OPERATOR_LIKE);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-03-31 17:24:15 +00:00
|
|
|
public function orLike($field, $value) : self
|
2019-08-21 20:13:00 +00:00
|
|
|
{
|
2020-03-31 17:24:15 +00:00
|
|
|
$this->or($field, $value, Query\Where::OPERATOR_LIKE);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function notLike($field, $value) : self
|
|
|
|
{
|
2020-03-31 17:24:15 +00:00
|
|
|
$this->notWhere($field, $value, Query\Where::OPERATOR_LIKE);
|
2020-01-29 21:11:16 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-03-31 17:24:15 +00:00
|
|
|
public function likes(array $fieldValues, string $condition = Query\Where::CONDITION_AND) : self
|
2020-03-29 02:13:29 +00:00
|
|
|
{
|
|
|
|
foreach($fieldValues as $field => $value) {
|
2020-03-31 17:24:15 +00:00
|
|
|
if ( is_array($value) ) {
|
|
|
|
switch ($value[1]) {
|
|
|
|
case Query\Where::CONDITION_AND:
|
|
|
|
$this->like($field, $value[0]);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Query\Where::CONDITION_OR:
|
|
|
|
$this->orLike($field, $value[0]);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case Query\Where::CONDITION_NOT:
|
|
|
|
$this->notLike($field, $value[0]);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$this->like($field, $value);
|
|
|
|
}
|
2020-03-29 02:13:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
public function match() : self
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public function notMatch() : self
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public function between() : self
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public function notBetween() : self
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public function groupBy() : self
|
|
|
|
{
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-03-29 02:13:29 +00:00
|
|
|
public function groups(array $groups) : self
|
|
|
|
{
|
|
|
|
# foreach($this->groups)
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-02-07 21:36:38 +00:00
|
|
|
public function orderBy($field, ? string $direction = null) : self
|
2019-08-21 20:13:00 +00:00
|
|
|
{
|
|
|
|
$this->queryBuilder->orderBy($field, $direction);
|
2020-02-06 04:41:57 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-03-29 02:13:29 +00:00
|
|
|
public function orders(array $orderList) : self
|
|
|
|
{
|
|
|
|
foreach($orderList as $field => $direction) {
|
|
|
|
$this->queryBuilder->orderBy($field, $direction);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
public function limit(int $value) : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->limit($value);
|
2020-02-06 04:41:57 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function offset(int $value) : self
|
|
|
|
{
|
|
|
|
$this->queryBuilder->offset($value);
|
2020-02-06 04:41:57 +00:00
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function commit() : self
|
|
|
|
{
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function rollback() : self
|
|
|
|
{
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2020-02-05 21:19:57 +00:00
|
|
|
public function wherePrimaryKey($value) : self
|
|
|
|
{
|
|
|
|
if ( null === $primaryKeyField = Ulmus::resolveEntity($this->entityClass)->getPrimaryKeyField() ) {
|
|
|
|
throw new Exception\EntityPrimaryKeyUnknown("Entity has no field containing attributes 'primary_key'");
|
|
|
|
}
|
2020-02-07 21:36:38 +00:00
|
|
|
|
|
|
|
$pkField = key($primaryKeyField);
|
|
|
|
|
|
|
|
return $this->where($primaryKeyField[$pkField]->name ?? $pkField, $value);
|
2020-02-05 21:19:57 +00:00
|
|
|
}
|
2020-04-09 14:00:48 +00:00
|
|
|
|
2020-03-29 02:13:29 +00:00
|
|
|
public function filterServerRequest(SearchRequest\SearchRequestInterface $searchRequest) : self
|
2019-08-21 20:13:00 +00:00
|
|
|
{
|
2020-03-31 17:24:15 +00:00
|
|
|
$searchRequest->count = $searchRequest->filter( clone $this )
|
|
|
|
->wheres($searchRequest->wheres(), Query\Where::OPERATOR_EQUAL, Query\Where::CONDITION_AND)
|
|
|
|
->likes($searchRequest->likes(), Query\Where::CONDITION_OR)
|
2020-03-29 02:13:29 +00:00
|
|
|
->orders($searchRequest->orders())
|
|
|
|
->groups($searchRequest->groups())
|
|
|
|
->count();
|
2020-02-07 21:36:38 +00:00
|
|
|
|
2020-03-31 17:24:15 +00:00
|
|
|
return $searchRequest->filter($this)
|
|
|
|
->wheres($searchRequest->wheres(), Query\Where::OPERATOR_EQUAL, Query\Where::CONDITION_AND)
|
|
|
|
->likes($searchRequest->likes(), Query\Where::CONDITION_OR)
|
2020-03-29 02:13:29 +00:00
|
|
|
->orders($searchRequest->orders())
|
|
|
|
->groups($searchRequest->groups())
|
|
|
|
->offset($searchRequest->offset())
|
|
|
|
->limit($searchRequest->limit());
|
|
|
|
}
|
2020-04-09 14:00:48 +00:00
|
|
|
|
2020-04-09 13:50:09 +00:00
|
|
|
public function collectionFromQuery(? string $entityClass = null) : EntityCollection
|
2019-08-21 20:13:00 +00:00
|
|
|
{
|
2020-04-09 13:50:09 +00:00
|
|
|
$class = $entityClass ?: $this->entityClass;
|
2019-08-21 20:13:00 +00:00
|
|
|
|
|
|
|
$entityCollection = new EntityCollection();
|
2020-02-07 21:36:38 +00:00
|
|
|
|
|
|
|
$this->selectSqlQuery();
|
|
|
|
|
|
|
|
$this->finalizeQuery();
|
2019-08-21 20:13:00 +00:00
|
|
|
|
2020-02-13 03:56:53 +00:00
|
|
|
foreach(Ulmus::iterateQueryBuilder($this->queryBuilder, $this->adapter) as $entityData) {
|
2019-08-21 20:13:00 +00:00
|
|
|
$entityCollection->append( ( new $class() )->entityFillFromDataset($entityData) );
|
|
|
|
}
|
|
|
|
|
|
|
|
return $entityCollection;
|
|
|
|
}
|
|
|
|
|
2020-02-17 13:23:41 +00:00
|
|
|
public function runQuery() : ? \PDOStatement
|
2019-12-19 14:54:33 +00:00
|
|
|
{
|
2020-02-07 21:36:38 +00:00
|
|
|
$this->finalizeQuery();
|
|
|
|
|
2020-02-13 03:56:53 +00:00
|
|
|
return Ulmus::runQuery($this->queryBuilder, $this->adapter);
|
2019-12-19 14:54:33 +00:00
|
|
|
}
|
|
|
|
|
2020-02-05 21:19:57 +00:00
|
|
|
protected function insertSqlQuery(array $dataset) : self
|
|
|
|
{
|
2020-02-07 21:36:38 +00:00
|
|
|
if ( null === $this->queryBuilder->getFragment(Query\Insert::class) ) {
|
2020-02-06 04:41:57 +00:00
|
|
|
$this->insert(array_keys($dataset), $this->entityResolver->tableName(), $this->alias, $this->entityResolver->schemaName());
|
2020-02-05 21:19:57 +00:00
|
|
|
}
|
|
|
|
|
2020-02-06 04:41:57 +00:00
|
|
|
$this->values($dataset);
|
2020-02-05 21:19:57 +00:00
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function updateSqlQuery(array $dataset) : self
|
|
|
|
{
|
2020-02-07 21:36:38 +00:00
|
|
|
if ( null === $this->queryBuilder->getFragment(Query\Update::class) ) {
|
2020-04-09 13:50:09 +00:00
|
|
|
$this->update($this->entityResolver->tableName(), $this->alias, $this->entityResolver->schemaName());
|
2020-02-05 21:19:57 +00:00
|
|
|
}
|
2020-02-06 04:41:57 +00:00
|
|
|
|
|
|
|
$this->set($dataset);
|
2020-02-05 21:19:57 +00:00
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
protected function selectSqlQuery() : self
|
|
|
|
{
|
2020-02-07 21:36:38 +00:00
|
|
|
if ( null === $this->queryBuilder->getFragment(Query\Select::class) ) {
|
2019-08-21 20:13:00 +00:00
|
|
|
$this->select("{$this->alias}.*");
|
|
|
|
}
|
|
|
|
|
2020-02-07 21:36:38 +00:00
|
|
|
if ( null === $this->queryBuilder->getFragment(Query\From::class) ) {
|
2020-01-29 21:11:16 +00:00
|
|
|
$this->from($this->entityResolver->tableName(), $this->alias, $this->entityResolver->schemaName());
|
2019-08-21 20:13:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2019-12-19 14:54:33 +00:00
|
|
|
protected function deleteSqlQuery() : self
|
|
|
|
{
|
2020-02-07 21:36:38 +00:00
|
|
|
if ( null === $this->queryBuilder->getFragment(Query\Delete::class) ) {
|
2019-12-19 14:54:33 +00:00
|
|
|
$this->delete();
|
|
|
|
}
|
|
|
|
|
2020-02-07 21:36:38 +00:00
|
|
|
if ( null === $this->queryBuilder->getFragment(Query\From::class) ) {
|
|
|
|
$this->from($this->entityResolver->tableName(), null, $this->entityResolver->schemaName());
|
2019-12-19 14:54:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
2019-08-21 20:13:00 +00:00
|
|
|
protected function fromRow($row) : self
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function fromCollection($rows) : self
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
2020-02-03 16:13:26 +00:00
|
|
|
|
|
|
|
public function table()
|
|
|
|
{
|
|
|
|
return "REFLECT TABLE";
|
|
|
|
}
|
2020-02-07 21:36:38 +00:00
|
|
|
|
2020-04-09 17:20:07 +00:00
|
|
|
public function escapeTable(string $identifier) : string
|
|
|
|
{
|
|
|
|
return $this->adapter->adapter()->escapeIdentifier($identifier, Adapter\AdapterInterface::IDENTIFIER_TABLE);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function escapeDatabase(string $identifier) : string
|
|
|
|
{
|
|
|
|
return $this->adapter->adapter()->escapeIdentifier($identifier, Adapter\AdapterInterface::IDENTIFIER_DATABASE);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function escapeSchema(string $identifier) : string
|
|
|
|
{
|
|
|
|
return $this->adapter->adapter()->escapeIdentifier($identifier, Adapter\AdapterInterface::IDENTIFIER_SCHEMA);
|
|
|
|
}
|
|
|
|
|
2020-02-07 21:36:38 +00:00
|
|
|
protected function finalizeQuery() : void {}
|
2019-08-21 20:13:00 +00:00
|
|
|
}
|