Puncte:1

entityQuery returnează un rezultat greșit: prea multe alinări?

drapel cn

Am creat un entityQuery pentru o entitate personalizată de tip „vot”. Vreau doar să obțin acele voturi pentru un anumit sondaj și pe cele ale deputaților care sunt membri ai unei anumite fracțiuni. Calitatea de membru al fracțiunii se poate modifica de-a lungul legislaturii, așa că avem o entitate personalizată suplimentară de tip „fraction_membership” în care pot fi setate fracția și timpul în care a fost valabilă apartenența la fracție. Deci, ceea ce avem nevoie este o interogare care să ofere doar voturile membrilor fracțiunii care erau membri ai fracțiunii la momentul sondajului.

Ora validă a unui membru fraction_membership poate fi setată în două câmpuri de dată: valid_from și valid_until.

$fractieId = 22;
$pollId = 1234;
$pollDate = '2020-05-10'
$interogare = \Drupal::entityQuery('vot');
$interogare->conditie('sondaj', $Id sondaj, '=');
$interogare->interval(0, 100);
$interogare->sort('id, 'DESC');
$query->condition('mandat.entity.fraction_membership.entity.fraction', fractionId);
$interogare->condiție(
   $interogare->sauConditionGroup()
      ->notExists('mandat.entity.fraction_membership.entity.valid_from')
      ->condition('mandat.entity.fraction_membership.entity.valid_from', $pollDate, '<=')
);
$interogare->condiție(
   $interogare->sauConditionGroup()
      ->notExists('mandat.entity.fraction_membership.entity.valid_until')
      ->condition('mandat.entity.fraction_membership.entity.valid_until', $pollDate, '>=')
);

Există două entități fraction_membership conectate la un singur mandat al unui anumit deputat, deoarece acesta și-a schimbat calitatea de membru al fracțiunii:

Intrările din tabelul fraction_membership:

| id | fracție | valid_din | valabil până la
| 123 | 22 | NULL | 27-09-2019
| 456 | 231 | 2019-09-28 | NUL

Problema: cu fracțiunea 22 și data sondajului „2020-05-10” setate ca filtre, votul deputatului își găsește drumul în rezultat, deși nu a existat un membru al fracțiunii valabil în acest moment. Data valid_until pentru apartenența la fracțiunea cu fracția 22 (= 2019-09-27) este mai mică decât data sondajului (= 2020-05-10). Pentru sondajul dat, votul deputatului ar trebui să fie în rezultate numai dacă filtrul pentru fracțiune a fost setat la 231.

Am verificat interogarea rezultată și pentru mine se pare că s-au adăugat prea multe alinări. Poate că aceasta este problema sau am greșit ceva?

Interogarea SQL rezultată:

SELECT "base_table"."id" AS "id", "base_table"."id" AS "base_table_id"
DIN
{aw_vote_vote} „base_table”
INNER JOIN {aw_vote_vote} „aw_vote_vote” ON [aw_vote_vote].[id] = [base_table].[id]
STANGA EXTERIOR JOIN {candidacies_mandates} „candidacies_mandates” ON [candidacies_mandates].[id] = [aw_vote_vote].[mandat]
INNER JOIN {candidacy_mandate__fraction_membership} "candidacy_mandate__fraction_membership" ON [candidacy_mandate__fraction_membership].[entity_id] = [candidacies_mandates].[id]
ÎNSCRIERE EXTERIOR STANGA {fraction_membership} „fraction_membership” ON [fraction_membership].[id] = [candidacy_mandate__fraction_membership].[fraction_membership_target_id]
INNER JOIN {fraction_membership} „fraction_membership_2” ON [fraction_membership_2].[id] = [fraction_membership].[id]
ÎNSCRIEȚI LA STÂNGA {aw_vote_vote} „aw_vote_vote_2” ON [aw_vote_vote_2].[id] = [base_table].[id]
STANGA EXTERIOR JOIN {candidacies_mandates} „candidacies_mandates_2” ON [candidacies_mandates_2].[id] = [aw_vote_vote_2].[mandat]
LEFT JOIN {candidacy_mandate__fraction_membership} „candidacy_mandate__fraction_membership_2” ON [candidacy_mandate__fraction_membership_2].[entity_id] = [candidacies_mandates_2].[id]
ÎNSCRIERE EXTERIOR STANGA {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]
STANGA EXTERIOR JOIN {candidacies_mandates} „candidacies_mandates_3” ON [candidacies_mandates_3].[id] = [aw_vote_vote_2].[mandat]
ÎNSCRIERE EXTERIOR STANGA {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]
ÎNSCRIEȚI LA STÂNGA {aw_vote_vote} „aw_vote_vote_3” ON [aw_vote_vote_3].[id] = [base_table].[id]
STANGA EXTERIOR JOIN {candidacies_mandates} „candidacies_mandates_4” ON [candidacies_mandates_4].[id] = [aw_vote_vote_3].[mandat]
LEFT JOIN {candidacy_mandate__fraction_membership} „candidacy_mandate__fraction_membership_3” ON [candidacy_mandate__fraction_membership_3].[entity_id] = [candidacies_mandates_4].[id]
ÎNSCRIERE EXTERIOR STANGA {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]
STANGA EXTERIOR JOIN {candidacies_mandates} „candidacies_mandates_5” ON [candidacies_mandates_5].[id] = [aw_vote_vote_3].[mandat]
ÎNSCRIERE EXTERIOR STANGA {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]
WHERE ("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) sau ("fraction_membership_6"."valid_from" >=valid_from :db_condition_placeholder_2)) AND (("fraction_membership_8"."valid_until" ESTE NULL) sau ("fraction_membership_10"."valid_until" <= :db_condition_placeholder_3))
GROUP BY table_base.id
ORDENAȚI DUPĂ „base_table”. „id” DESC
LIMITA 100 OFFSET 0

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.