Рейтинг:0

EntityQuery, исключить узлы с NOT IN из многозначного поля ссылки на сущность

флаг cn

Друпал версии 9.3.8 Недавно я использовал команду entityQuery, и для более простых запросов у меня не было проблем. Теперь мне нужно отфильтровать, а также для операторов '=' и 'IN' также узлы, у которых многозначное поле не имеет значений… или которые не имеют определенных значений. Читая документацию, я использовал оператор «НЕ В», но с плохими результатами. Пример запрос должен вернуть мне узлы, которые не имеют значения 161 и 163 Это запрос, который я упростил, чтобы попробовать оператор «НЕ В»

$nids = \Drupal::entityTypeManager()->getStorage('узел')->getQuery()
->условие('тип', 'гестион')
-> не существует ('field_attivita')
->условие('field_attivita', ['161', '163'], 'НЕ ВНУТРИ' )
->выполнить();

Я также пробовал с оператором '<>', но ничего не поделаешь

Среди различных статей и вопросов я также прочитал сообщение, которое близко к моему запросу. Как использовать entityQuery для выбора, если поле entityReference с несколькими значениями не содержит идентификатор но я не могу понять, почему это не работает

leymannx avatar
флаг ne
Что это не существует? Что с .target_id, как показано в связанных ответах?
sonfd avatar
флаг in
Я не уверен, но я не думаю, что вы можете сделать это в одном запросе. Я думаю, вам может понадобиться 1. запросить все, 2. запросить элементы с идентификаторами, которые вам не нужны, а затем удалить идентификаторы из запроса 2 из набора результатов запроса 1. Что, кстати, в основном то, что связанный ответ говорит.
sonfd avatar
флаг in
Я думаю, что проблема здесь в том, как хранятся значения ссылки на сущность - каждое значение в поле с несколькими значениями получает свою собственную строку в таблице БД. Если бы кардинальность вашего поля была равна 1, вы могли бы использовать not equals для каждого значения, которое хотите исключить.
флаг cn
sonfd, спасибо за ответ и за объяснение.Как уже упоминалось, я недавно подходил к запросам (извините также за мой элементарный английский, это тоже будет по этой причине, мне будет неясно) Я провел несколько тестов, основанных на ваших предложениях, и, возможно, я понял, что вы мне сказали. Но есть одна вещь, которую я не понимаю. Я написал некоторые данные для примера Поз. Поле_деятельность | $ вар 1 300 | 161 2 161 | 163 3 400 | 4 163 | 5 пусто | 6 200 | 7 163 | 8 пусто | ...
флаг cn
если я использую условие -> условие ('conflict_activity_field', [161, 163], 'IN') это возвращает мне узлы в позициях 2-4 и 7 примера -> условие ('conflict_activity_field', [161, 163], 'НЕ ВНУТРИ') должны уничтожать только узлы, которые не содержат 161 и 163 В противном случае я не понял, что делает оператор «НЕ В», руководство по SQL подтверждает это. Я озадачен делать 2 запроса и тут разница между массивами, запрос сложный и много данных может тормозить обработку
флаг cn
leymannx, спасибо за ответ, но я его не понял. notExist указывает, не содержит ли многозначное поле данных. target_id — это nid узла

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.