Verschachtelte UND / ODER Abfrage mit hook_views_query_alter
am 01.03.2021 - 19:57 Uhr in
Ich habe eine Media-View, um einen Entity-Browser zu erstellen.
Die Bilder, die in dieser View selektiert werden, haben ein zusätzliches Referenzfeld auf alle User einer bestimmten Rolle (Intranet) und es kann entweder kein User oder mehrere User ausgewählt sein.
Wenn eine Auswahl getroffen ist, dann soll der angemeldete User nur Bilder mit seiner Userid sehen.
Und er sieht alle Bilder, bei denen keine Auswahl getroffen wurde.
In der Media-Entity-Browser-View kann ich keinen Und/Oder Filter auf den angemeldeten Benutzer machen.
Deshalb habe ich es mit einer views_query_alter Funktion gelöst.
So sieht die Funktion aus:
<?php
function pdf_options_views_query_alter(Drupal\views\ViewExecutable $view, Drupal\views\Plugin\views\query\Sql $query){
if ($view->id() == 'media_entity_browser') {
$userid = \Drupal::currentUser()->id();
$query->addWhere('2', 'media__field_gesellschafter.field_gesellschafter_target_id', $userid , '=');
}
}
?>
Die SQL-Vorschau sieht dann so aus.
SELECT media_field_data.mid AS mid
FROM
{media_field_data} media_field_data
LEFT JOIN {media__field_gesellschafter} media__field_gesellschafter ON media_field_data.mid = media__field_gesellschafter.entity_id AND media__field_gesellschafter.deleted = '0'
WHERE (media_field_data.bundle IN ('bilderpool_75x110')) AND
(
(media__field_gesellschafter.field_gesellschafter_target_id IS NULL)
OR (media__field_gesellschafter.field_gesellschafter_target_id = '33')
)
In diesem Fall ist 33 die Userid des angemeldeten Users.
Die View funktioniert also korrekt.
Ich weiß allerdings nicht warum. ;-)
Woher weiß die View, dass ich mit
<?php
$query->addWhere('2', 'media__field_gesellschafter.field_gesellschafter_target_id', $userid , '=');
?>
diese geschachtelte UND / Oder Abfrage erzeugen möchte?
Ich habe auch Beispiele gefunden, wo der Ausdruck so geheißen hat:
<?php
$query->addWhere('OR', 'media__field_gesellschafter.field_gesellschafter_target_id', $userid , '=');
?>
Das hat aber nicht zum richtigen Ergebnis geführt.
Ich habe kein vernünftiges Tutorial zum Thema $query->addWhere gefunden.
Und auch die Beschreibung des Hooks hat mich nicht schlauer gemacht.
Meine Vermutung: Die 2 steht einfach für die AbfrageGruppe?
Kann jemand was dazu sagen?
- Anmelden oder Registrieren um Kommentare zu schreiben
addWhere fügt eine Oderbedingung hinzu
am 05.04.2021 - 09:57 Uhr
Da eine UserID nur einen Wert haben kann, machen nur Oderbedingungen Sinn.
Grüße
Ronald
Ronald, danke für Deine
am 05.04.2021 - 11:35 Uhr
Ronald, danke für Deine Mühe.
Ich weiß schon gar nicht mehr, was ich da vor hatte. ;-)
LG Regina Oswald
-------------------------
Montviso - Internetdienstleistungen
http://www.montviso.de