Puncte:0

Cum să utilizați funcția sql MAX() în interogarea pluginului vizualizări

drapel gb

Creez un filtru de vizualizări personalizate pentru un câmp de vizualizări personalizate. Următorul SQL va realiza filtrul pe care îl caut:

selectați nid, moderation_state, content_entity_id, MAX(content_entity_revision_id) 
  din nodul inner join content_moderation_state_field_revision pe nid = content_entity_id 
    unde content_entity_id = 59 grupează după content_entity_id

În fișierul php pentru pluginul de filtrare a vizualizărilor mele, am următorul cod pentru a adăuga SQL-ul de mai sus la interogarea de filtru:

/**
   * Funcția de ajutor care creează interogarea.
   */
  interogare de funcție publică () {
    dacă (!gol ($această->valoare)) {
      $configurare = [
        'table' => 'content_moderation_state_field_revision',
        'field' => 'content_entity_id',
        'left_table' => 'node_field_data',
        'left_field' => 'nid',
        'operator' => '=',
      ];
      $join = Views::pluginManager('join')->createInstance('standard', $configuration);
      $this->query->addRelationship('content_moderation_state_field_revision', $join, 'node_field_data');
      $this->query->addExpression('MAX(content_moderation_state_field_revision.content_entity_revision_id)');
      $this->query->groupBy("content_moderation_state_field_revision.content_entity_id");
      $this->query->addWhere('ȘI', 'content_moderation_state_field_revision', $this->value, 'IN');
    }
  }

Această eroare este generată atunci când se execută o interogare:

Eroare: apel la metoda nedefinită Drupal\views\Plugin\views\query\Sql::addExpression()

In timp ce addExpression() face parte din baza de date de bază API nu este acceptat în pluginul de interogare a vizualizărilor sql api,

Deci, am nevoie de o soluție pentru a adăuga expresia MAX() la interogare. Orice sugestii despre cum să faci asta?

Puncte:0
drapel gb

Am găsit o soluție!

Acest cod SQL îmi oferă în esență ceea ce caut:

selectați * din content_moderation_state_field_revision unde (content_entity_id, content_entity_revision_id) în 
  ( 
    selectați content_entity_id, MAX(content_entity_revision_id) din grupul content_moderation_state_field_revision după content_entity_id 
  ) 
  și moderation_state = „schiță”

Rețineți că funcțiile MAX și gruparea după sunt toate în subinterogarea SQL, care nu necesită nicio intrare $row. Deci, am creat o funcție în modulul meu pentru a scoate rezultatele acelei subinterogări și am adăugat-o ca o condiție în interogarea filtrului plugin. Ca aceasta:

/**
   * Funcția de ajutor care creează interogarea.
   */
  interogare de funcție publică () {
    dacă (!gol ($această->valoare)) {
      // Afișează pluginul de gestionare a unirii: https://api.drupal.org/api/drupal/core%21modules%21views%21src%21Plugin%21views%21join%21JoinPluginBase.php/group/views_join_handlers/8.2.x
      $configurare = [
        'type' => 'INNER',
        'table' => 'content_moderation_state_field_revision',
        'field' => 'content_entity_id',
        'left_table' => 'node_field_data',
        'left_field' => 'nid',
        'operator' => '=',
      ];
      $join = Views::pluginManager('join')->createInstance('standard', $configuration);
      $this->query->addRelationship('content_moderation_state_field_revision', $join, 'node_field_data');     
      $this->query->addGroupBy("content_moderation_state_field_revision.content_entity_id");
      $revision_ids = sbn_moderation_state_sql_subquery(); // returnează cel mai mare ID_reviziune_entității
      $this->query->addWhere('AND', 'content_entity_revision_id', $revision_ids, 'IN');
      $this->query->addWhere('AND', 'moderation_state', $this->value, 'IN');
    }
  }

Mai am clauza addGroupBy, dar nu cred că este necesară deoarece funcția MAX se află în subinterogarea care se ocupă de returnarea celui mai mare content_entity_revision_id pentru fiecare nod.

Desigur, încă nu cunosc sintaxa corectă pentru adăugarea funcției MAX() în sintaxa api SQL de interogare a pluginului de vizualizare. Daca stie cineva, va rog sa adaugati si raspunsul.

Oricum, filtrul funcționează ca un farmec -- pot filtra vizualizarea după noduri publicate sau schiță sau ambele.

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.