2022-01-09 03:49:51 +08:00
|
|
|
<?php
|
2023-04-16 01:45:33 +08:00
|
|
|
declare(strict_types=1);
|
2022-01-09 03:49:51 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace Database\Traits;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
use Database\ActiveQuery;
|
|
|
|
|
use Database\ISqlBuilder;
|
|
|
|
|
use Exception;
|
|
|
|
|
use JetBrains\PhpStorm\Pure;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Class CaseWhen
|
|
|
|
|
* @package Database\Traits
|
|
|
|
|
*/
|
|
|
|
|
class When
|
|
|
|
|
{
|
|
|
|
|
|
2026-06-12 23:57:19 +08:00
|
|
|
public ActiveQuery|ISqlBuilder $query;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var array
|
|
|
|
|
*/
|
|
|
|
|
private array $_condition = [] {
|
|
|
|
|
&get {
|
|
|
|
|
return $this->_condition;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var string
|
|
|
|
|
*/
|
|
|
|
|
private string $else = '' {
|
|
|
|
|
get {
|
|
|
|
|
return $this->else;
|
|
|
|
|
}
|
|
|
|
|
set(string $value) {
|
|
|
|
|
$this->else = $value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* CaseWhen constructor.
|
|
|
|
|
* @param string $column
|
|
|
|
|
* @param ActiveQuery|ISqlBuilder $activeQuery
|
|
|
|
|
*/
|
|
|
|
|
public function __construct(public string $column, public ActiveQuery|ISqlBuilder $activeQuery)
|
|
|
|
|
{
|
|
|
|
|
$this->_condition[] = 'CASE ' . $column;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param string|int $condition
|
|
|
|
|
* @param string $then
|
|
|
|
|
* @return $this
|
|
|
|
|
* @throws
|
|
|
|
|
*/
|
|
|
|
|
public function when(string|int $condition, string $then): static
|
|
|
|
|
{
|
|
|
|
|
$this->_condition[] = sprintf('WHEN %s THEN %s', $condition, $then);
|
|
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param string $alias
|
|
|
|
|
*/
|
|
|
|
|
public function else(string $alias): void
|
|
|
|
|
{
|
|
|
|
|
$this->else = $alias;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
#[Pure]
|
|
|
|
|
public function end(): string
|
|
|
|
|
{
|
|
|
|
|
if (empty($this->_condition)) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
$prefix = implode(' ', $this->_condition);
|
|
|
|
|
if (!empty($this->else)) {
|
|
|
|
|
$prefix .= ' ELSE ' . $this->else;
|
|
|
|
|
}
|
|
|
|
|
return '(' . $prefix . ' END)';
|
|
|
|
|
}
|
2022-01-09 03:49:51 +08:00
|
|
|
|
|
|
|
|
}
|