Skip to content

Commit 7054647

Browse files
committed
Fix #251: add modifiers as anonymous functions
1 parent 678e205 commit 7054647

File tree

5 files changed

+44
-5
lines changed

5 files changed

+44
-5
lines changed

src/builder/SQLBuilder.php

+9-4
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,15 @@ public function applyModifier($query)
101101
foreach ($oselect->getSelect() as $field => $ofield) {
102102
if ($ofield->hasModifier()) {
103103
foreach ($ofield->getModifierList() as $name => $params) {
104-
$modifierHandler = "mod_$name";
105-
$modifierClass = $this->osuql->getModifierClass($modifierHandler);
106-
if ($modifierClass)
107-
$modifierClass::$modifierHandler($ofield, $params);
104+
if ($name === 'callback' && $params instanceof Closure) {
105+
$params($ofield);
106+
}
107+
else {
108+
$modifierHandler = "mod_$name";
109+
$modifierClass = $this->osuql->getModifierClass($modifierHandler);
110+
if ($modifierClass)
111+
$modifierClass::$modifierHandler($ofield, $params);
112+
}
108113
}
109114
}
110115
}

src/core/SuQLField.php

+4
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ public function addModifier($name, $params = []) {
3232
$this->modifier[$name] = $params;
3333
}
3434

35+
public function addCallbackModifier($callback) {
36+
$this->modifier["callback"] = $callback;
37+
}
38+
3539
public function delModifier($name) {
3640
unset($this->modifier[$name]);
3741
}

src/syntax/SuQL.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,11 @@ public function field($name, $modifiers = [], $visible = true)
9595

9696
$this->getQuery($this->query())->addField($currentModel->table(), $name, $visible);
9797

98-
if (ArrayHelper::isSequential($modifiers))
98+
if ($modifiers instanceof Closure)
99+
{
100+
$this->getQuery($this->query())->getField($currentModel->table(), $name)->addCallbackModifier($modifiers);
101+
}
102+
else if (ArrayHelper::isSequential($modifiers))
99103
{
100104
foreach ($modifiers as $modifier)
101105
{

tests/SuQLObjectTest.php

+16
Original file line numberDiff line numberDiff line change
@@ -288,4 +288,20 @@ public function testEmptyDriver(): void
288288
'error' => [SuQLError::DRIVER_NOT_DEFINED],
289289
]);
290290
}
291+
292+
public function testCallbackModifier(): void
293+
{
294+
$this->init();
295+
296+
$this->osuql->addSelect('main');
297+
$this->osuql->getQuery('main')->addFrom('users');
298+
$this->osuql->getQuery('main')->addField('users', 'id');
299+
$this->osuql->getQuery('main')->getField('users', 'id')->addCallbackModifier(function($ofield){
300+
$ofield->getOSelect()->addWhere("{$ofield->getField()} > 5");
301+
});
302+
$this->assertEquals($this->osuql->getSQL(['main']),
303+
'select users.id from users where users.id > 5'
304+
);
305+
$this->assertNull($this->osuql->getSQL('all'));
306+
}
291307
}

tests/SuQLTest.php

+10
Original file line numberDiff line numberDiff line change
@@ -211,4 +211,14 @@ public function testToStringSuQL(): void
211211
'select users.id, users.name from users'
212212
);
213213
}
214+
215+
public function testCallbackModifier(): void
216+
{
217+
$this->assertEquals(
218+
User::find()->field('id', function($ofield){
219+
$ofield->getOSelect()->addWhere("{$ofield->getField()} > 5");
220+
})->getRawSql(),
221+
'select users.id from users where users.id > 5'
222+
);
223+
}
214224
}

0 commit comments

Comments
 (0)