Ändern einer inneren Verknüpfung in eine linke Verknüpfung in Ansichten 3.3?


7

Mit Ansichten 3.3 habe ich eine Ansicht in Drupal 7, in der zwei Inhaltstypen angezeigt werden. Ich habe ein Filterkriterium, das auf dem Wert eines Feldes basiert, das nur einem der Inhaltstypen zugeordnet ist. Solange ich diese Feldkriterien habe, führen Ansichten eine aus INNER JOIN, wodurch keine Ansichten des ersten Inhaltstyps zurückgegeben werden, an die dieses Feld nicht angehängt ist.

Ich habe die Abfrage aus der Ansicht kopiert, INNERin einen LEFTJoin geändert , sie in die MySQL-Shell eingefügt und alle Zeilen erhalten, die ich erwartet hatte. Ich weiß jedoch nicht, wie ich diese Änderungen im Ansichtseditor vornehmen soll.

Ich habe im Beziehungseditor im Beziehungsblock herumgespielt, aber nicht gesehen, wo ich den Join-Typ ändern kann.

Kann ich ändern, wie Views 3.3 beitritt?


2
Nur eine Notiz; Dieses Verhalten ist ein Fehler in Views 3.5+: drupal.org/node/1766338
geerlingguy

Antworten:


19

Ich habe bei dem Klicken auf reduce duplicatesCheckbox umgewandelt meine INNER JOINsan LEFT JOINs:

Darstellen des Kontrollkästchens "Duplikate reduzieren"

Bevor ich etwas Ähnliches in meine Abfrage einfließen ließ:

INNER JOIN {field_data_field_random_field field_data_field_random_field} 
        ON node.nid = field_data_field_random_field.entity_id 
       AND (field_data_field_random_field.entity_type = 'node' 
       AND field_data_field_random_field.deleted = '0')

Diese inneren Verknüpfungen wurden durch einfache Taxonomiefilter verursacht, so dass ich leider keine Beziehungen hatte, die ich nicht anfordern konnte. Das Aktivieren dieses Kontrollkästchens scheint meine Abfrage jedoch nicht auf andere Weise geändert zu haben, außer zum Entfernen der inneren Verknüpfungen, was für mich perfekt ist. und kann jemand anderem da draußen in diesem riesigen Affenabenteuer helfen, das Leben genannt wird.


1
Dies ist hilfreich, wenn Sie Filter wie Boolesche Felder, Taxonomiebegriffe usw. hinzufügen. Danke!
Geerlingguy

Die Option "Duplikate reduzieren" berücksichtigt diese Knoten nicht, wenn sie nicht in der Tabelle des Verknüpfungsfelds vorhanden sind. Die hook_views_query_alter()Lösung erscheint in diesem Fall also vielversprechender.
Pratip Ghosh

11

Ich habe hook_views_query_alter()es immer geändert. Es wird auf die Objekte $ view und $ query verwiesen. Ich habe den Namen der Ansicht überprüft, um festzustellen, ob es der gewünschte war, und dann den Join-Typ im Abfrageobjekt für die Tabelle von Interesse geändert:

function my_module_views_query_alter(&$view, &$query) {
  if($view->name == 'my_view') {
    $query->table_queue['field_data_field_my_field']['join']->type = "LEFT";
  }
}

Warum möchten Sie einen views_query_alter verwenden, wenn dies über die vorhandene GUI möglich ist? drupal.stackexchange.com/questions/52449/…
Gokul NK

Dieser Code hat diesen Fehler für mich verursacht: Schwerwiegender Fehler: Aufruf der undefinierten Methode stdClass :: build_join () in C: \ xampp \ htdocs \ sarpoosh \ sites \ all \ modules \ views \ plugins \ views_plugin_query_default.inc in Zeile 1313
shekoufeh

2
@GokulNK Da nicht alle Ansichten Beziehungen verwenden (die Ansicht von OP nicht) und diese UI-Option nicht für Joins verfügbar ist, die nicht auf Beziehungen basieren.
Coredumperror

4

Wenn Sie in den Ansichten zur Registerkarte "Beziehungen" wechseln, wird ein Kontrollkästchen mit dem Titel "Diese Beziehung erforderlich" angezeigt.

Geben Sie hier die Bildbeschreibung ein

  1. Wenn Sie dieses Kontrollkästchen aktivieren, bedeutet dies: Machen Sie eine innere Verknüpfung
  2. Wenn Sie dieses Kontrollkästchen deaktivieren, bedeutet dies: Machen Sie einen Link-Join

Ich bin gerade auf ein solches Problem gestoßen. Ich dachte, das Problem sei "Diese Beziehung erforderlich", aber eine Änderung hat das Problem nicht behoben. Durch Überprüfen der Option "Duplikate reduzieren" wurde das Problem für mich behoben.
Ndvo

1

Fügen Sie der Vollständigkeit halber nur einige Informationen für diejenigen hinzu, die in ihrer Ansicht UND / ODER-Gruppen verwenden.

Ich habe ein Filterkriterium, das beim Umschalten der letzten beiden Bedingungen zwischen einem inneren und einem linken Join geändert wird.

Um meine aktuellen Filterkriterien zu erklären, ist im Grunde Folgendes:

(Published = "Yes" AND Content Type = "Blog) AND ((Blog Type = "X") OR (Blog Type IS NULL))

Was einen INNER JOIN verwendet und mir nicht die gewünschten Ergebnisse liefert. Wenn ich nur die letzten beiden Bedingungen im OP austausche, ändert sich der JOIN-Typ:

(Published = "Yes" AND Content Type = "Blog) AND ((Blog Type IS NULL) OR (Blog Type = "X"))

Dies verwendet einen LEFT JOIN. Gehen Sie Figur, könnte aber für jemand anderen nützlich sein.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.