У меня никогда не было необходимости делать это до сегодняшнего дня, но, похоже, вы не можете делать OR-запросы с помощью EntityFieldQuery
, так db_or
как используется для запросов select.
Примером могут быть все объекты, имеющие поле даты, в котором значение равно нулю или после сегодняшнего дня.
Я что-то упустил или какой-то трюк, или это просто не поддерживается?
Ответы:
Я видел решение этой проблемы . Идея заключается в использовании
addTag()
в запросе и реализацииhook_query_TAG_alter()
, где у вас есть старый добрыйSelectQuery
объект.источник
Вы можете создать подкласс
EntityFieldQuery
и переопределить некоторые методы.Условия, которые добавляются к объекту класса
EntityFieldQuery
(например, условие свойства), добавляются в массив.Когда запрос построен, этот массив затем используется в цикле, подобном следующему (код присутствует в EntityFieldQuery :: propertyQuery () ):
$select_query
содержит значение, возвращаемое из вызоваdb_select()
.источник
Боюсь, ты не можешь, классы не поддерживают OR
EntityFieldQuery
.Одним из способов решения этой проблемы может быть добавление тега к запросу с помощью
->addTag()
, а затем реализацияhook_query_TAG_alter()
для изменения внутренней структуры запроса вручную для запросов, содержащих этот тег.Делая это, вы сможете пройти через существующие условия и внести необходимые изменения, чтобы добавить свою
OR
логику. Это не очень хороший способ сделать это; Вы можете найти пример здесь .источник
Не нужно разбивать запросы на 2 и объединять или что-то в этом роде. Просто нужно изменить запрос
Рассмотрим сценарий: у меня было 2 типа сущностей с именами машин: операторы tincan и tincan_agents
5 справочных полей объекта на объекте
4 из них являются ссылочными полями обычных сущностей, а 5-е (tincan_object) является ссылочным полем с несколькими сущностями, каждое ссылочное поле ссылается на сущности типа «Агент».
Ссылочное поле tincan_object может ссылаться на Агенты и Действия (третий тип сущности). Агент имеет свойство object_type, которое может быть агентом или группой.
Я хочу найти любое Заявление, которое ссылается на одного из нескольких возможных Агентов, в любом из полей ссылки. Нам нужен оператор OR между fieldConditions, но мы также должны проверить object_type ссылочного поля для нескольких объектов и убедиться, что это одна из двух возможностей.
Приведенный ниже код представляет собой простейшее из возможных, в нашем решении запрос имел много других условий, полей и т. Д., Поэтому код должен был не учитывать порядок условий или даже если запрашивались все эти поля.
Решение: обратите внимание на вышеуказанный EntityFieldQuery
Это помечает запрос, позволяя реализовать hook_query_TAG_alter ()
источник
ОП хочет запросить сущности с нулевой датой ИЛИ больше, чем х, я хотел запросить узлы без определенного языка ИЛИ язык пользователя.
addTag()
является лучшим решением для добавления фактического оператора OR, но в моем случае это было бы излишним. Мое очень простое ИЛИ может быть достигнуто путем поиска свойства языка в массиве с помощью:источник