query = collect(); $this->appName = $appName; } public function toQuery(): string { $ret = ""; foreach ($this->query as $ele) { $ret .= $ele; $ret .= " "; } $ret .= $this->order; // logger(sprintf("QUERY[%s]:%s", $this->appName, $ret)); return $ret; } public function where(string|Closure $column, string|int|null $condition = null, KintoneRecordQueryOperator $operator = KintoneRecordQueryOperator::EQ) { return $this->whereQuery("and", $operator->value, $column, $condition); } public function notWhere(string|Closure $column, string|int|null $condition = null, KintoneRecordQueryOperator $operator = KintoneRecordQueryOperator::EQ) { return $this->whereQuery("and", $operator->value, $column, $condition); } public function orWhere(string|Closure $column, string|int|null $condition = null, KintoneRecordQueryOperator $operator = KintoneRecordQueryOperator::EQ) { $this->whereQuery("or", $operator->value, $column, $condition); return $this; } public function notOrWhere(string|Closure $column, string|int|null $condition = null, KintoneRecordQueryOperator $operator = KintoneRecordQueryOperator::EQ) { return $this->whereQuery("or", $operator->value, $column, $condition); } public function whereIn(string|Closure $column, array $condition) { return $this->whereQuery("and", "in", $column, $condition); } public function whereNotIn(string|Closure $column, array $condition) { return $this->whereQuery("and", "not in", $column, $condition); } public function orWhereIn(string|Closure $column, array $condition) { return $this->whereQuery("or", "not in", $column, $condition); } public function whereDate(string $column, Carbon $date, KintoneRecordQueryOperator $operator = KintoneRecordQueryOperator::EQ) { return $this->whereQuery("and", $operator->value, $column, $date->format('Y-m-d')); } public function whereDateTime(string $column, Carbon $date, KintoneRecordQueryOperator $operator = KintoneRecordQueryOperator::EQ) { return $this->whereQuery("and", $operator->value, $column, $date->toIso8601ZuluString()); } public function orWhereDate(string $column, Carbon $date, KintoneRecordQueryOperator $operator = KintoneRecordQueryOperator::EQ) { return $this->whereQuery("or", $operator->value, $column, $date->format('Y-m-d')); } public function orWhereDateTime(string $column, Carbon $date, KintoneRecordQueryOperator $operator = KintoneRecordQueryOperator::EQ) { return $this->whereQuery("or", $operator->value, $column, $date->toIso8601ZuluString()); } public function orderByAsc(string $column) { return $this->orderBy($column, "asc"); } public function orderByDesc(string $column) { return $this->orderBy($column, "desc"); } private function orderBy(string $column, string $order) { $this->order = sprintf("order by %s %s", $column, $order); return $this; } private function whereQuery( string $andOr, string $operator, string|Closure $column, string|int|array|null $condition ) { if (!$this->query->isEmpty()) { $this->query->push($andOr); } if (is_string($column)) { if (is_string($condition)) { $this->query->push(sprintf( '%s %s "%s"', $column, $operator, $condition, )); return $this; } if (is_int($condition)) { $this->query->push(sprintf( '%s %s %d', $column, $operator, $condition, )); return $this; } if (is_array($condition)) { $in = ""; foreach ($condition as $ele) { if (is_string($ele)) { if ($in !== "") { $in .= ", "; } $in .= sprintf('"%s"', $ele); } if (is_integer($ele)) { if ($in !== "") { $in .= ", "; } $in .= sprintf('%d', $ele); } } $this->query->push(sprintf( '%s %s (%s)', $column, $operator, $in, )); return $this; } } if ($column instanceof Closure) { $nestedCondition = new self($this->appName); $column($nestedCondition); $this->query->push(sprintf( '(%s)', $nestedCondition->toQuery() )); return $this; } } }