Query::filter() как обернуть условие в OR?

Задавал вопрос уже по теме https://qna.habr.com/q/1260818 попытаюсь переформулировать.

Есть вот такой фильтр

'filter' => \Bitrix\Main\Entity\Query::filter()->where(
              [
                ["UF_ACTIVE", "=", 1],
                ["UF_ELEMENT_ID", "=", $arFields["ID"]],
                ["UF_CREATED_BY", "!=", ['column' => 'UF_USER_ID']],
                ['UF_DATE_ACTIVE', "<=", mktime(23,59,59,date("m"),date("d")+1,date("Y"))],
                ['UF_DATE_ACTIVE', "=", null]
              ])


он формирует вот такой запрос

WHERE (`table`.`UF_ACTIVE` = 1 AND `table`.`UF_ELEMENT_ID` = 1 AND `table`.`UF_CREATED_BY` <> 1 AND `table`.`UF_DATE_ACTIVE` <= 1678568399 AND `table`.`UF_DATE_ACTIVE` IS NULL)


мне нужно его подправить в такой

WHERE (
`table`.`UF_ACTIVE` = 1 AND `table`.`UF_ELEMENT_ID` = 1 AND `table`.`UF_CREATED_BY` <> 1 
AND 
( `table`.`UF_DATE_ACTIVE` <= 1678568399 OR `table`.`UF_DATE_ACTIVE` IS NULL)
)

т.е. между полями UF_DATE_ACTIVE и UF_DATE_ACTIVE поставить OR и к другим условиям присоединить через AND

в документации для этого есть LOGIC=>OR

добавляю в массив это условие

'filter' => \Bitrix\Main\Entity\Query::filter()->where(
              [

                ["UF_ACTIVE", "=", 1],
                ["UF_ELEMENT_ID", "=", $arFields["ID"]],
                ["UF_CREATED_BY", "!=", ['column' => 'UF_USER_ID']],

                // lдобавляю оператор OR между полями 
                [
                  'LOGIC' => 'OR',
                  ['UF_DATE_ACTIVE', "<=", mktime(23,59,59,date("m"),date("d")+1,date("Y"))],
                  ['UF_DATE_ACTIVE', "=", null]
                ]
              ])


и получаю вот это

[Bitrix\Main\ArgumentException] 
Unknown operator `Array` (100)
  • Вопрос задан
  • 418 просмотров
Решения вопроса 1
yous
@yous Автор вопроса
короче переделал вот в это

->where([
      ["UF_ACTIVE", "=", 1],
      ["UF_ELEMENT_ID", "=", $arFields["ID"]],
   ])
->whereColumn('UF_CREATED_BY',"!=", 'UF_USER_ID')
->where(\Bitrix\Main\Entity\Query::filter()
->logic('or')
->where([
   ['UF_DATE_ACTIVE', "<=", mktime(23,59,59,date("m"),date("d")+1,date("Y"))],
   ['UF_DATE_ACTIVE', "=", null],
]))


получил что хотел

SELECT 
	COUNT(*) AS `CNT`
FROM `table` `table` 
WHERE 
      `table`.`UF_ACTIVE` = 1 
AND 
      `table`.`UF_ELEMENT_ID` = 1 
AND 
      `table`.`UF_CREATED_BY` <> `table`.`UF_USER_ID` 
AND 
(`table`.`UF_DATE_ACTIVE` <= 1678568399 OR `table`.`UF_DATE_ACTIVE` IS NULL)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы