Рейтинг:1

entityQuery возвращает неправильный результат: слишком много объединений?

флаг cn

Я создал entityQuery для пользовательского типа сущности «голосование». Я хочу получить только те голоса за конкретный опрос и голоса депутатов, которые входят в конкретную фракцию. Членство во фракции может меняться во время работы законодательного органа, поэтому у нас есть дополнительная пользовательская сущность типа «fraction_membership», в которой можно установить фракцию и время, в течение которого членство во фракции было действительным. Итак, что нам нужно, так это запрос, который дает только голоса членов фракции, которые были членами фракции на момент опроса.

Действительное время для Fraction_membership можно установить в двух полях даты: valid_from и valid_until.

$фракионид = 22;
$pollId = 1234;
$pollDate = '2020-05-10'
$query = \Drupal::entityQuery('голосование');
$запрос->условие('опрос', $pollId, '=');
$запрос->диапазон(0, 100);
$query->sort('id, 'DESC');
$query->условие('mandate.entity.fraction_membership.entity.fraction', FractionId);
$ запрос-> условие (
   $запрос->orConditionGroup()
      -> notExists ('mandate.entity.fraction_membership.entity.valid_from')
      ->условие('mandate.entity.fraction_membership.entity.valid_from', $pollDate, '<=')
);
$ запрос-> условие (
   $запрос->orConditionGroup()
      -> не существует ('mandate.entity.fraction_membership.entity.valid_until')
      ->условие('mandate.entity.fraction_membership.entity.valid_until', $pollDate, '>=')
);

Есть две сущности Fraction_membership, связанные с одним мандатом конкретного заместителя, потому что он изменил членство во фракции:

Записи в таблице Fraction_membership:

| идентификатор | дробь | valid_from | годен до
| 123 | 22 | НУЛЕВОЙ | 2019-09-27
| 456 | 231 | 2019-09-28 | НОЛЬ

Проблема: с фракцией 22 и датой голосования «2020-05-10», установленными в качестве фильтров, голос депутата попадает в результат, хотя в это время действительного членства во фракции не было. Дата valid_until для членства во фракции с фракцией 22 (= 2019-09-27) меньше, чем дата опроса (= 2020-05-10). Для данного опроса голос депутата должен быть в результатах только в том случае, если фильтр фракции был установлен на 231.

Я проверил полученный запрос, и мне кажется, что добавлено слишком много объединений. Может в этом проблема или я что-то не так сделал?

Результирующий SQL-запрос:

ВЫБЕРИТЕ «base_table». «id» КАК «id», «base_table». «id» КАК «base_table_id»
ОТ
{aw_vote_vote} "базовая_таблица"
ВНУТРЕННЕЕ СОЕДИНЕНИЕ {aw_vote_vote} "aw_vote_vote" ON [aw_vote_vote].[id] = [base_table].[id]
LEFT OUTER JOIN {candidacies_mandates} "candidacies_mandates" ON [candidacies_mandates].[id] = [aw_vote_vote].[mandate]
ВНУТРЕННЕЕ СОЕДИНЕНИЕ {candidacy_mandate__fraction_membership} "candidacy_mandate__fraction_membership" ON [candidacy_mandate__fraction_membership].[entity_id] = [candidacies_mandates].[id]
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ {fraction_membership} "fraction_membership" ON [fraction_membership].[id] = [candidacy_mandate__fraction_membership].[fraction_membership_target_id]
ВНУТРЕННЕЕ СОЕДИНЕНИЕ {fraction_membership} "fraction_membership_2" ON [fraction_membership_2].[id] = [fraction_membership].[id]
LEFT JOIN {aw_vote_vote} "aw_vote_vote_2" ON [aw_vote_vote_2].[id] = [base_table].[id]
LEFT OUTER JOIN {candidacies_mandates} "candidacies_mandates_2" ON [candidacies_mandates_2].[id] = [aw_vote_vote_2].[mandate]
LEFT JOIN {candidacy_mandate__fraction_membership} "candidacy_mandate__fraction_membership_2" ON [candidacy_mandate__fraction_membership_2].[entity_id] = [candidacies_mandates_2].[id]
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ {fraction_membership} "fraction_membership_3" ON [fraction_membership_3].[id] = [candidacy_mandate__fraction_membership_2].[fraction_membership_target_id]
LEFT JOIN {fraction_membership} "fraction_membership_4" ON [fraction_membership_4].[id] = [fraction_membership_3].[id]
LEFT OUTER JOIN {candidacies_mandates} "candidacies_mandates_3" ON [candidacies_mandates_3].[id] = [aw_vote_vote_2].[mandate]
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ {fraction_membership} "fraction_membership_5" ON [fraction_membership_5].[id] = [candidacy_mandate__fraction_membership_2].[fraction_membership_target_id]
LEFT JOIN {fraction_membership} "fraction_membership_6" ON [fraction_membership_6].[id] = [fraction_membership_5].[id]
LEFT JOIN {aw_vote_vote} "aw_vote_vote_3" ON [aw_vote_vote_3].[id] = [base_table].[id]
LEFT OUTER JOIN {candidacies_mandates} "candidacies_mandates_4" ON [candidacies_mandates_4].[id] = [aw_vote_vote_3].[mandate]
LEFT JOIN {candidacy_mandate__fraction_membership} "candidacy_mandate__fraction_membership_3" ON [candidacy_mandate__fraction_membership_3].[entity_id] = [candidacies_mandates_4].[id]
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ {fraction_membership} "fraction_membership_7" ON [fraction_membership_7].[id] = [candidacy_mandate__fraction_membership_3].[fraction_membership_target_id]
LEFT JOIN {fraction_membership} "fraction_membership_8" ON [fraction_membership_8].[id] = [fraction_membership_7].[id]
LEFT OUTER JOIN {candidacies_mandates} "candidacies_mandates_5" ON [candidacies_mandates_5].[id] = [aw_vote_vote_3].[mandate]
ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ {fraction_membership} "fraction_membership_9" ON [fraction_membership_9].[id] = [candidacy_mandate__fraction_membership_3].[fraction_membership_target_id]
LEFT JOIN {fraction_membership} "fraction_membership_10" ON [fraction_membership_10].[id] = [fraction_membership_9].[id]
ГДЕ ("aw_vote_vote"."poll" = :db_condition_placeholder_0) AND ("fraction_membership_2"."fraction" = :db_condition_placeholder_1) AND (("fraction_membership_4"."valid_from" IS NULL) или ("fraction_membership_6"."valid_from" >= :db_condition_placeholder_2)) И (("fraction_membership_8"."valid_until" IS NULL) или ("fraction_membership_10"."valid_until" <= :db_condition_placeholder_3))
СГРУППИРОВАТЬ ПО base_table.id
ЗАКАЗАТЬ ПО "base_table"."id" DESC
ПРЕДЕЛ 100 СМЕЩЕНИЕ 0

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

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