Example #1
0
 /**
  * @param string $key
  * @param array $options
  * @return mixed
  * @throws Exception
  */
 public function getRelationLazy($key, $options = [])
 {
     /** @var \T4\Orm\Model $class */
     $class = get_class($this);
     $relations = $class::getRelations();
     if (empty($relations[$key])) {
         throw new Exception('No such column or relation: ' . $key . ' in model of ' . $class . ' class');
     }
     $relation = $relations[$key];
     switch ($relation['type']) {
         case $class::BELONGS_TO:
             /** @var \T4\Orm\Model $relationClass */
             $relationClass = $relation['model'];
             $thisColumnName = $class::getRelationLinkName($relation);
             $thatColumnName = $class::getBelongsToThatLinkColumnName($relation);
             $subModel = $relationClass::findByColumn($thatColumnName, $this->{$thisColumnName}, $options);
             if (empty($subModel)) {
                 return null;
             } else {
                 return $subModel;
             }
             break;
         case $class::HAS_ONE:
             /** @var \T4\Orm\Model $relationClass */
             $relationClass = $relation['model'];
             $thisColumnName = $class::getHasOneThisLinkColumnName($relation);
             $thatColumnName = $class::getRelationLinkName($relation);
             $subModel = $relationClass::findByColumn($thatColumnName, $this->{$thisColumnName}, $options);
             if (empty($subModel)) {
                 return null;
             } else {
                 return $subModel;
             }
             break;
         case $class::HAS_MANY:
             /** @var \T4\Orm\Model $relationClass */
             $relationClass = $relation['model'];
             $thisColumnName = $class::getHasManyThisLinkColumnName($relation);
             $thatColumnName = $class::getRelationLinkName($relation);
             return $relationClass::findAllByColumn($thatColumnName, $this->{$thisColumnName}, $options);
             break;
         case $class::MANY_TO_MANY:
             /** @var \T4\Orm\Model $relationClass */
             $relationClass = $relation['model'];
             $linkTable = $class::getRelationLinkName($relation);
             $pivots = $relationClass::getPivots($class, $key);
             if (!empty($pivots)) {
                 $pivotColumnsSql = ', ' . implode(', ', array_map(function ($x) {
                     return 'j1.' . $x;
                 }, array_keys($pivots)));
             } else {
                 $pivotColumnsSql = '';
             }
             $query = new Query();
             $query->select('t1.*' . $pivotColumnsSql)->from($relationClass::getTableName())->join($linkTable, 't1.' . $relationClass::PK . '=j1.' . static::getManyToManyThatLinkColumnName($relation), 'left')->where('(j1.' . static::getManyToManyThisLinkColumnName($relation) . '=:id)' . (isset($options['where']) ? ' AND (' . $options['where'] . ')' : ''));
             if (isset($options['order'])) {
                 $query->order($options['order']);
             }
             $query->params([':id' => $this->getPk()]);
             /** @var \T4\Orm\Model $relationClass */
             $result = $relationClass::getDbConnection()->query($query)->fetchAllObjects($relationClass);
             if (!empty($result)) {
                 $ret = new Collection($result);
                 $ret->setNew(false);
                 return $ret;
             } else {
                 return new Collection();
             }
     }
 }
Example #2
0
 public function findAllByQuery($class, $query, $params = [])
 {
     if ($query instanceof QueryBuilder) {
         $params = $query->getParams();
         $query = $query->getQuery($this);
     }
     $result = $class::getDbConnection()->query($query, $params)->fetchAll(\PDO::FETCH_CLASS, $class);
     if (!empty($result)) {
         $ret = new Collection($result);
         $ret->setNew(false);
     } else {
         $ret = new Collection();
     }
     return $ret;
 }
Example #3
0
 public function findAllByQuery($class, $query, $params = [])
 {
     if ($query instanceof QueryBuilder) {
         $params = $query->getParams();
         $query = $query->getQuery($this);
     }
     if ($query instanceof Query) {
         $params = array_merge($params, $query->params);
         $query = $this->makeQueryString($query);
     }
     /** @var \T4\Orm\Model $class */
     $result = $class::getDbConnection()->query($query, $params)->fetchAllObjects($class);
     if (!empty($result)) {
         $ret = new Collection($result);
         $ret->setNew(false);
     } else {
         $ret = new Collection();
     }
     return $ret;
 }