Compare commits

...

7 Commits

Author SHA1 Message Date
as2252258 be3fc004d5 eee 2024-10-23 14:32:09 +08:00
as2252258 bbe0631f5b eee 2024-10-23 14:10:14 +08:00
as2252258 bf5d988ba4 eee 2024-10-11 11:55:32 +08:00
as2252258 4fc9b42540 eee 2024-10-09 16:01:22 +08:00
as2252258 e5453807f2 eee 2024-09-05 15:42:24 +08:00
as2252258 5a6f6da70a eee 2024-09-02 12:12:39 +08:00
as2252258 beb48f41d2 eee 2024-08-27 11:19:22 +08:00
5 changed files with 75 additions and 23 deletions
+43 -1
View File
@@ -73,6 +73,48 @@ class ActiveQuery extends QueryTrait implements ISqlBuilder
} }
/**
* @param string $column
* @param int|float $amount
* @return bool
*/
public function increment(string $column, int|float $amount = 1): bool
{
return (bool)$this->buildCommand($this->builder->mathematics([$column => $amount]))->exec();
}
/**
* @param array $attributes
* @return bool
*/
public function increments(array $attributes): bool
{
return (bool)$this->buildCommand($this->builder->mathematics($attributes))->exec();
}
/**
* @param string $column
* @param int|float $amount
* @return bool
*/
public function decrement(string $column, int|float $amount = 1): bool
{
return (bool)$this->buildCommand($this->builder->mathematics([$column => $amount], '-'))->exec();
}
/**
* @param array $attributes
* @return bool
*/
public function decrements(array $attributes): bool
{
return (bool)$this->buildCommand($this->builder->mathematics($attributes, '-'))->exec();
}
/** /**
* @throws * @throws
*/ */
@@ -95,7 +137,7 @@ class ActiveQuery extends QueryTrait implements ISqlBuilder
return; return;
} }
if (Context::inCoroutine()) { if (Context::inCoroutine()) {
Coroutine::create(fn() => $closure($data)); Coroutine::create(fn () => $closure($data));
} else { } else {
call_user_func($closure, $data); call_user_func($closure, $data);
} }
+14 -8
View File
@@ -1,4 +1,5 @@
<?php /** @noinspection ALL */ <?php
/** @noinspection ALL */
/** /**
* Created by PhpStorm. * Created by PhpStorm.
* User: whwyy * User: whwyy
@@ -222,8 +223,8 @@ abstract class Model extends Component implements ModelInterface, ArrayAccess, \
*/ */
public function getPrimaryValue(): ?int public function getPrimaryValue(): ?int
{ {
if ($this->hasPrimary()) { if ($this->hasPrimary() && isset($this->_oldAttributes[$this->getPrimary()])) {
return (int)$this->_oldAttributes[$this->getPrimary()] ?? null; return (int)$this->_oldAttributes[$this->getPrimary()];
} else { } else {
return null; return null;
} }
@@ -234,13 +235,14 @@ abstract class Model extends Component implements ModelInterface, ArrayAccess, \
* @return Model|null * @return Model|null
* @throws * @throws
*/ */
public static function findOne(int|string|array $param): ?static public static function findOne(int|string|array|null $param): ?static
{ {
if (empty($param)) return null;
$model = static::instance(); $model = static::instance();
$query = new ActiveQuery($model); $query = new ActiveQuery($model);
$query->from($model->getTable())->alias('t1'); $query->from($model->getTable())->alias('t1');
if (is_numeric($param)) { if (is_numeric($param)) {
$query->where([$model->getPrimary() => $param]); $query->where([$model->getPrimary() => +$param]);
} else if (is_array($param)) { } else if (is_array($param)) {
$query->where($param); $query->where($param);
} else { } else {
@@ -440,10 +442,13 @@ abstract class Model extends Component implements ModelInterface, ArrayAccess, \
if ($lastId === false) { if ($lastId === false) {
return false; return false;
} }
if ($this->hasPrimary()) { if (!$this->hasPrimary()) {
$this->_attributes[$this->getPrimary()] = $lastId; return $this->refresh()->afterSave($this->_attributes, []);
} }
return $this;
$this->_attributes[$this->getPrimary()] = $lastId;
return $this->refresh()->afterSave($this->_attributes, [$this->getPrimary() => $lastId]);
} }
@@ -653,6 +658,7 @@ abstract class Model extends Component implements ModelInterface, ArrayAccess, \
public function refresh(): static public function refresh(): static
{ {
$this->_oldAttributes = $this->_attributes; $this->_oldAttributes = $this->_attributes;
$this->isNewExample = false;
return $this; return $this;
} }
+4 -2
View File
@@ -109,6 +109,7 @@ class Command extends Component
{ {
$client = $this->connection->getConnection(); $client = $this->connection->getConnection();
try { try {
$startTime = microtime(true);
if (($prepare = $client->prepare($this->sql)) === false) { if (($prepare = $client->prepare($this->sql)) === false) {
throw new Exception('(' . $prepare->errorInfo()[0] . ')' . $client->errorInfo()[2]); throw new Exception('(' . $prepare->errorInfo()[0] . ')' . $client->errorInfo()[2]);
} }
@@ -118,7 +119,7 @@ class Command extends Component
$result = $method == 'rowCount' ? $prepare->rowCount() : $prepare->{$method}(PDO::FETCH_ASSOC); $result = $method == 'rowCount' ? $prepare->rowCount() : $prepare->{$method}(PDO::FETCH_ASSOC);
$prepare->closeCursor(); $prepare->closeCursor();
$this->connection->println($this->sql, $this->params); $this->connection->println($startTime, microtime(true), $this->sql, $this->params);
return $result; return $result;
} catch (Throwable $throwable) { } catch (Throwable $throwable) {
@@ -151,6 +152,7 @@ class Command extends Component
{ {
$client = $this->connection->getConnection(); $client = $this->connection->getConnection();
try { try {
$startTime = microtime(true);
if (($prepare = $client->prepare($this->sql)) === false) { if (($prepare = $client->prepare($this->sql)) === false) {
throw new Exception('(' . $prepare->errorInfo()[0] . ')' . $prepare->errorInfo()[2]); throw new Exception('(' . $prepare->errorInfo()[0] . ')' . $prepare->errorInfo()[2]);
} }
@@ -161,7 +163,7 @@ class Command extends Component
$result = $client->lastInsertId(); $result = $client->lastInsertId();
$this->connection->println($this->sql, $this->params); $this->connection->println($startTime, microtime(true), $this->sql, $this->params);
return $result == 0 ? $prepare->rowCount() : (int)$result; return $result == 0 ? $prepare->rowCount() : (int)$result;
} catch (Throwable $throwable) { } catch (Throwable $throwable) {
+12 -10
View File
@@ -79,14 +79,16 @@ class Connection extends Component
/** /**
* @param float $startTime
* @param float $endTime
* @param string $sql * @param string $sql
* @param array $params * @param array $params
* @return void * @return void
*/ */
public function println(string $sql, array $params = []): void public function println(float $startTime, float $endTime, string $sql, array $params = []): void
{ {
if (is_callable($this->_println)) { if (is_callable($this->_println)) {
call_user_func($this->_println, $sql, $params); call_user_func($this->_println, $startTime, $endTime, $sql, $params);
} }
} }
@@ -113,7 +115,7 @@ class Connection extends Component
*/ */
public function tick(): void public function tick(): void
{ {
$this->timerId = Timer::tick($this->tick_time, fn() => $this->checkClientHealth($this->pool())); $this->timerId = Timer::tick($this->tick_time, fn () => $this->checkClientHealth($this->pool()));
} }
@@ -349,13 +351,13 @@ class Connection extends Component
{ {
$pdo = new PDO($this->database, $this->cds, $this->username, $this->password, [ $pdo = new PDO($this->database, $this->cds, $this->username, $this->password, [
// $pdo = new \PDO('mysql:dbname=' . $this->database . ';host=' . $this->cds, $this->username, $this->password, [ // $pdo = new \PDO('mysql:dbname=' . $this->database . ';host=' . $this->cds, $this->username, $this->password, [
\PDO::ATTR_CASE => \PDO::CASE_NATURAL, \PDO::ATTR_CASE => \PDO::CASE_NATURAL,
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
\PDO::ATTR_ORACLE_NULLS => \PDO::NULL_NATURAL, \PDO::ATTR_ORACLE_NULLS => \PDO::NULL_NATURAL,
\PDO::ATTR_STRINGIFY_FETCHES => false, \PDO::ATTR_STRINGIFY_FETCHES => false,
\PDO::ATTR_EMULATE_PREPARES => true, \PDO::ATTR_EMULATE_PREPARES => true,
\PDO::ATTR_TIMEOUT => $this->timeout, \PDO::ATTR_TIMEOUT => $this->timeout,
\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ' . $this->charset \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES ' . $this->charset
]); ]);
foreach ($this->attributes as $key => $attribute) { foreach ($this->attributes as $key => $attribute) {
$pdo->setAttribute($key, $attribute); $pdo->setAttribute($key, $attribute);
+2 -2
View File
@@ -18,10 +18,10 @@ interface ModelInterface
{ {
/** /**
* @param array|string|int $param * @param array|string|int|null $param
* @return ModelInterface|null * @return ModelInterface|null
*/ */
public static function findOne(array|string|int $param): ?static; public static function findOne(array|string|int|null $param): ?static;
/** /**