Support "if" in <group> inside <groups> #2595

This commit is contained in:
Kijin Sung 2025-09-01 00:31:20 +09:00
parent 386f93fc6c
commit 51762315de
4 changed files with 19 additions and 2 deletions

View file

@ -175,9 +175,10 @@ class DBQueryParser extends BaseParser
foreach ($xml->groups->children() as $tag)
{
$name = $tag->getName();
$ifvar = trim($tag['if'] ?? '') ?: null;
if ($name === 'group')
{
$query->groupby->columns[] = trim($tag['column'] ?? '');
$query->groupby->columns[] = [trim($tag['column'] ?? ''), $ifvar];
}
elseif ($name === 'having')
{

View file

@ -222,6 +222,14 @@ class Query extends VariableBase
$columns = array();
foreach ($this->groupby->columns as $column_name)
{
if (is_array($column_name))
{
list($column_name, $ifvar) = $column_name;
if ($ifvar && empty($this->_args[$ifvar]))
{
continue;
}
}
if (self::isValidColumnName($column_name))
{
$columns[] = self::quoteName($column_name);

View file

@ -15,6 +15,7 @@
</conditions>
<groups if="if_groupby">
<group column="member.member_srl" />
<group column="member.nick_name" if="if_groupby_nick_name" />
<having>
<condition operation="notequal" column="member.member_srl" var="exclude_member_srl" notnull="notnull" />
</having>

View file

@ -178,7 +178,8 @@ class DBQueryParserTest extends \Codeception\Test\Unit
$this->assertEquals('AND', $query->conditions[1]->pipe);
$this->assertTrue($query->groupby instanceof Rhymix\Framework\Parsers\DBQuery\GroupBy);
$this->assertEquals('member.member_srl', $query->groupby->columns[0]);
$this->assertEquals(['member.member_srl', null], $query->groupby->columns[0]);
$this->assertEquals(['member.nick_name', 'if_groupby_nick_name'], $query->groupby->columns[1]);
$this->assertEquals(1, count($query->groupby->having));
$this->assertTrue($query->groupby->having[0] instanceof Rhymix\Framework\Parsers\DBQuery\Condition);
$this->assertEquals('member.member_srl', $query->groupby->having[0]->column);
@ -196,6 +197,12 @@ class DBQueryParserTest extends \Codeception\Test\Unit
'AND `documents`.`document_srl` IN (?, ?, ?) GROUP BY `member`.`member_srl` HAVING `member`.`member_srl` != ?', $sql);
$this->assertEquals(['12', '34', '56', '4'], $params);
$args['if_groupby_nick_name'] = true;
$sql = $query->getQueryString('rx_', $args);
$this->assertEquals('SELECT `member`.`member_srl`, COUNT(*) AS `count` FROM `rx_documents` AS `documents`, `rx_member` AS `member` ' .
'WHERE `documents`.`member_srl` = `member`.`member_srl` AND `documents`.`member_srl` = `member`.`member_srl` ' .
'AND `documents`.`document_srl` IN (?, ?, ?) GROUP BY `member`.`member_srl`, `member`.`nick_name` HAVING `member`.`member_srl` != ?', $sql);
$args = array(
'document_srl_list' => [12, 34, 56], 'exclude_member_srl' => 4, 'exclude_document_srl_list' => '78,90',
'if_table' => true, 'if_column' => true, 'if_condition2' => true,