From dbdc05c4d8211bdb756506f827586922a0879b93 Mon Sep 17 00:00:00 2001 From: Johannes Meyer Date: Thu, 23 Oct 2025 15:29:37 +0200 Subject: [PATCH] Select a proper expression when performing exists queries ipl\Orm translates this, due to a quirk in PHP where numerical strings are interpreted as integer keys in arrays, to the second column of the given base model. This is undocumented behavior and must be avoided. --- application/controllers/ContactGroupsController.php | 5 +++-- application/forms/ChannelForm.php | 5 +++-- library/Notifications/Model/Rotation.php | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/application/controllers/ContactGroupsController.php b/application/controllers/ContactGroupsController.php index 5e0e20fd3..0917c9ffa 100644 --- a/application/controllers/ContactGroupsController.php +++ b/application/controllers/ContactGroupsController.php @@ -18,6 +18,7 @@ use ipl\Html\Form; use ipl\Html\HtmlString; use ipl\Html\TemplateString; +use ipl\Sql\Expression; use ipl\Stdlib\Filter; use ipl\Web\Compat\CompatController; use ipl\Web\Compat\SearchControls; @@ -91,8 +92,8 @@ public function indexAction(): void ); $emptyStateMessage = null; - if (Contact::on(Database::get())->columns('1')->limit(1)->first() === null) { - if (Channel::on(Database::get())->columns('1')->limit(1)->first() === null) { + if (Contact::on(Database::get())->columns([new Expression('1')])->limit(1)->first() === null) { + if (Channel::on(Database::get())->columns([new Expression('1')])->limit(1)->first() === null) { $addButton->disable($this->translate('A channel is required to add a contact group')); $emptyStateMessage = TemplateString::create( diff --git a/application/forms/ChannelForm.php b/application/forms/ChannelForm.php index 19d1868a7..2ea44de7f 100644 --- a/application/forms/ChannelForm.php +++ b/application/forms/ChannelForm.php @@ -20,6 +20,7 @@ use ipl\I18n\GettextTranslator; use ipl\I18n\StaticTranslator; use ipl\Sql\Connection; +use ipl\Sql\Expression; use ipl\Stdlib\Filter; use ipl\Validator\EmailAddressValidator; use ipl\Web\Common\CsrfCounterMeasure; @@ -128,13 +129,13 @@ protected function assemble(): void if ($this->channelId !== null) { $isInUse = Contact::on($this->db) - ->columns('1') + ->columns([new Expression('1')]) ->filter(Filter::equal('default_channel_id', $this->channelId)) ->first(); if ($isInUse === null) { $isInUse = RuleEscalationRecipient::on($this->db) - ->columns('1') + ->columns([new Expression('1')]) ->filter(Filter::equal('channel_id', $this->channelId)) ->first(); } diff --git a/library/Notifications/Model/Rotation.php b/library/Notifications/Model/Rotation.php index b105df7b3..6a75ca07e 100644 --- a/library/Notifications/Model/Rotation.php +++ b/library/Notifications/Model/Rotation.php @@ -145,7 +145,7 @@ public function delete(): void $requirePriorityUpdate = true; if (RotationConfigForm::EXPERIMENTAL_OVERRIDES) { $rotations = self::on($db) - ->columns('1') + ->columns([new Expression('1')]) ->filter(Filter::equal('schedule_id', $this->schedule_id)) ->filter(Filter::equal('priority', $this->priority)) ->first();