applyWhereClause('whereClause', $keyOrClause, $value); return $this; } protected function applyWhereClause(string $type, $keyOrClause, $value) { $this->params[$type] = $this->params[$type] ?? []; $original = $this->params[$type]; if (!is_string($keyOrClause) && !is_array($keyOrClause)) { throw new InvalidArgumentException(); } if (is_array($keyOrClause)) { $new = $keyOrClause; } if (is_string($keyOrClause)) { $new = [$keyOrClause => $value]; } $containsSameKeys = (bool) count( array_intersect( array_keys($new), array_keys($original) ) ); if ($containsSameKeys) { $this->params[$type][] = $new; return $this; } $this->params[$type] = $new + $original; return $this; } /** * Apply ORDER. * * @param string|int|array $orderBy An attribute to order by or order definitions as an array. * @param bool|string $direction 'ASC' or 'DESC'. TRUE for DESC order. * If the first argument is an array then should be omitied. */ public function order($orderBy, $direction = Select::ORDER_ASC) : self { if (!$orderBy) { throw InvalidArgumentException(); } if (is_array($orderBy)) { $this->params['orderBy'] = $orderBy; return $this; } $this->params['orderBy'] = $this->params['orderBy'] ?? []; $this->params['orderBy'][] = [$orderBy, $direction]; return $this; } /** * Add JOIN. * * @param string $relationName A relationName or table. A relationName is in camelCase, a table is in CamelCase. * */ public function join($relationName, ?string $alias = null, ?array $conditions = null) : self { if (empty($this->params['joins'])) { $this->params['joins'] = []; } if (is_array($relationName)) { $joinList = $relationName; foreach ($joinList as $item) { $this->params['joins'][] = $item; } return $this; } if (is_null($alias) && is_null($conditions) && $this->hasJoinAlias($relationName)) { return $this; } if (is_null($alias) && is_null($conditions)) { $this->params['joins'][] = $relationName; return $this; } if (is_null($conditions)) { $this->params['joins'][] = [$relationName, $alias]; return $this; } $this->params['joins'][] = [$relationName, $alias, $conditions]; return $this; } /** * Add LEFT JOIN. * * @param string $relationName A relationName or table. A relationName is in camelCase, a table is in CamelCase. */ public function leftJoin($relationName, ?string $alias = null, ?array $conditions = null) : self { if (empty($this->params['leftJoins'])) { $this->params['leftJoins'] = []; } if (is_array($relationName)) { $joinList = $relationName; foreach ($joinList as $item) { $this->params['leftJoins'][] = $item; } return $this; } if (is_null($alias) && is_null($conditions) && $this->hasLeftJoinAlias($relationName)) { return $this; } if (is_null($alias) && is_null($conditions)) { $this->params['leftJoins'][] = $relationName; return $this; } if (is_null($conditions)) { $this->params['leftJoins'][] = [$relationName, $alias]; return $this; } $this->params['leftJoins'][] = [$relationName, $alias, $conditions]; return $this; } /** * Whether an alias is in left joins. */ public function hasLeftJoinAlias(string $alias) : bool { $leftJoins = $this->params['leftJoins'] ?? []; if (in_array($alias, $leftJoins)) { return true; } foreach ($leftJoins as $item) { if (is_array($item) && count($item) > 1) { if ($item[1] === $alias) { return true; } } } return false; } /** * Whether an alias is in joins. */ public function hasJoinAlias(string $alias) : bool { $joins = $this->params['joins'] ?? []; if (in_array($alias, $joins)) { return true; } foreach ($joins as $item) { if (is_array($item) && count($item) > 1) { if ($item[1] === $alias) { return true; } } } return false; } }