/** * Return where part of query. * * @param int $id * @return string */ private function getWherePartById($id) { if (empty($id)) { throw new InvalidArgumentException("Value '{$id}' is not a valid ID"); } return $this->connection->prepare('(`id` = ?)', $id); }
/** * {@inheritdoc} */ public function uniqueWhere($field_name, $where, ...$context) { if (empty($field_name)) { throw new InvalidArgumentException("Value '{$field_name}' is not a valid field name"); } if (empty($context) && (!array_key_exists($field_name, $this->field_values) || $this->field_values[$field_name] === null)) { return true; // NULL is always good for single column keys because MySQL does not check NULL for uniqueness } $field_names = [$field_name]; if (count($context)) { $field_names = array_merge($field_names, $context); } // Check if we have existsing columns foreach ($field_names as $v) { if (!array_key_exists($v, $this->field_values)) { throw new InvalidArgumentException("Field '{$v}' is not known"); } } $table_name = $this->connection->escapeTableName($this->table_name); $conditions = []; if ($where) { $conditions[] = $this->connection->prepareConditions($where); } foreach ($field_names as $v) { $escaped_field_name = $this->connection->escapeFieldName($v); if ($this->field_values[$v] === null) { $conditions[] = "{$escaped_field_name} IS NULL"; } else { $conditions[] = $this->connection->prepare("{$escaped_field_name} = ?", $this->field_values[$v]); } } $conditions = implode(' AND ', $conditions); if (empty($this->object_id)) { $sql = sprintf("SELECT COUNT(`id`) AS 'row_count' FROM {$table_name} WHERE {$conditions}"); } else { $sql = $this->connection->prepare("SELECT COUNT(`id`) AS 'row_count' FROM {$table_name} WHERE ({$conditions}) AND (`id` != ?)", $this->old_object_id ? $this->old_object_id : $this->object_id); } if ($this->connection->executeFirstCell($sql) > 0) { if (empty($context)) { $this->addFieldError($field_name, "Value of '{$field_name}' needs to be unique"); } else { $this->addFieldError($field_name, "Value of '{$field_name}' needs to be unique in context of " . implode(', ', array_map(function ($field_name) { return "'{$field_name}'"; }, $context))); } return false; } return true; }
/** * Insert a row with the given field values. * * @param mixed ...$field_values */ public function insert(...$field_values) { if ($this->is_done) { throw new RuntimeException('This batch insert is already done'); } if (count($field_values) == $this->fields_num) { $this->rows[] = $this->connection->prepare($this->row_prepare_pattern, ...$field_values); if (count($this->rows) == $this->rows_per_batch) { $this->flush(); } } else { throw new BadMethodCallException('Number of arguments does not match number of fields'); } }