Laravel DB-Query - zwei Bedingungen?

yoyo2435x

Cadet 3rd Year
Registriert
Juli 2021
Beiträge
34
Hallo zusammen,

ich arbeite gerade mit Laravel und versuche eine DB-Query zu erstellen - so schaut sie aus:

PHP:
$events = Architecture::where('channel', 'NW')->where('region', $event->region)->where('date', '>=', $today_db)->get();

Funktioniert auch soweit. Jetzt habe ich aber noch zwei andere Attribute: x und y als Beispiel.
Beide Attribute können Zahlen zwischen o und 1000 haben. Jetzt möchte ich mit der obigen
Query aber nur Daten abrufen, bei denen NICHT x=1 UND NICHT y=1 ist.

Nur wenn beide(!) x UND y nicht 1 sind, dann soll der Datensatz ausgegeben werden.

Habt ihr eine Idee, wie ich das am besten realisieren kann?

Grüße.
 
floq0r schrieb:
Was passiert wenn du where('x', '!=', 1)->where('y', '!=', 1) anhängst? Kenne Laravel nicht

Das war auch mein erster Gedanke. Aber was ist denn, wenn x != 1, aber y != 1 -
geht das dann auch? Oder bricht der im erster Bereich (x != 1) dann schon ab?
 
Genau. Es sollte x != 1 UND y != 1 sein. Also: 0/0, 2/4, was auch immer.

Aber was ist, wenn x = 1 und y = 2 ist?
Dann ist die Bedingung ja bei x != 1 schon nicht erfüllt,
obwohl sie ja eigentlich erfüllt sein müsste, da y ungleich 1 ist. Oder?
 
Ich verstehe. Dann funktioniert das so auf diesem Weg nicht. Ich hol mal weiter aus.
Es gibt Einzelfahrten und Gruppenfahrten.
x stellt die Anzahl der gebuchten Fahrten dar, y hingegen die Anzahl der möglichen Fahrten.
Wenn die Anzahl möglicher Fahrten bei 1 liegt (als eine Einzelfahrt ist), soll die Fahrt nur mit in die
Query, wenn noch keine Fahrt gebucht wurde - also x = 0 ist. Ab x = 1 dann nicht mehr. 1 Fahrt
von einer Fahrt gebucht. Datensatz soll nicht mit in die Query / nicht mehr angezeigt werden.

Sind die möglichen Fahrten aber < 1 - also 2, 3, was auch immer....
Dann können beliebig viele Fahrten gebucht werden. Es kann auch überbucht werden.

Im Endeffekt soll nur der Datensatz NICHT mit in die Query, wenn nur eine Fahrt
möglich ist UND diese eine Fahrt gebucht wurde. Geht sowas über die Query?
 
y (also mögliche Fahrten) = 0 kommt nicht vor. Mindestens 1.
Sorry, meinte natürlich > (größer) 1.

Bei "wenn x != 1 UND y != 1" sehe ich das Problem da,
dass die Bedingung schon false ist, wenn x = 1 ist und bspw. y = 2.
Aber sie soll nur falsch sein, wenn beide ( x UND y) ungleich 1 sind.
Müsste also beiden gemeinsam ausgewertet werden.
 
Zuletzt bearbeitet:
Korrekt.

Aber die erste Logik bricht meines Wissens schon ab, wenn x = 1 ist und prüft y erst gar nicht
mehr. Obwohl y ja auch 2 sein könnte und die Bedingung (x != 1 und y != 1) dann richtig wäre.

Ich denke mal die Alternative wäre da besser. Aber wie bekomme ich das am besten in eine
Laravel Query in der oben genannten Form? :-/
 
Das könnte funktionieren. Ich teste es mal. Sorry, manchmal erkläre ich einfach zu kompliziert.
 
Ich habe es jetzt so umgesetzt: "...->where([['x', '!=', 1], ['y', '!=', 1]])->get()"

Leider aber ohne Erfolg. Ich erhalte den Datensatz schon nicht, wenn nur x = 1 ist,
obwohl y = 2 ist. Der bricht schon nach der Prüfung von x ab obwohl der Daten-
satz nur dann ausgeblendet werden soll, wenn x UND y = 1 wären.
 
Ich hab mir jetzt eine Excel machen müssen, damit ich das verstehe
- aber das macht durchaus Sinn :D

Jetzt habe ich allerdings dadurch ein neues Problem generiert...

Die Abfrage sieht jetzt so aus:
"
Architecture::where('channel', 'ST')
->where('date', '>=', $today_db)
->where('is_inactive', 0)
->where('x', '!=', 1)
->orWhere('y', '!=', 1)->get();
"

Ist orWhere = true, wird ausgegeben - da ignoriert er aber die ersten drei where.
Im Endeffekt soll das erste bis dritte where true sein, dann die Sache mit x und y.
Kann man das irgendwie separieren? In reinem SQL würde ich jetzt Klammern
nutzen, aber das scheint hier nicht zu funktionieren.

Also quasi: date >= $today_db AND is_inactive == 0 AND (x != 1 OR y != 1);
 
Zurück
Oben