TYPO3 Extbase Repository Query: Wie Sie Datensätze suchen in M:N-Beziehung, wo mehrere Werte für N sind gegeben?
Haben wir ein einfaches Modell Unternehmen. Jedes Unternehmen kann eine oder mehrere Abteilungen Dept. Jede Abteilung wird von einem bestimmten Typ Typ.
Nun müssen wir eine Abfrage, wo alle Firmen zurückgegeben, die eine Abteilung des Typs X und eine vom Typ Y mindestens ein (d.h. jedes zurückgegebene Gesellschaft hat zwei oder mehr Abteilungen, mindestens ein X und ein Y).
Wie geht das mit einer Abfrage?
Diese Abfrage liefert keine Ergebnisse, wenn getTypes gibt mehr als einen Typ.
if (count($types = $demand->getTypes()) > 0) {
foreach ($types as $type)
$constraints[] = $query->contains('dept.type', $type);
}
$result = $query->matching($query->logicalAnd($query->logicalAnd($constraints)))->execute();
Diese Abfrage gibt Ergebnisse für Typ X oder Y
if (count($types = $demand->getTypes()) > 0) {
$constraints[] = $query->in('dept.type', $types);
}
Den Tabellen sieht wie folgt aus (vereinfacht):
CREATE TABLE IF NOT EXISTS `company` (
`uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(128) NOT NULL,
PRIMARY KEY (`uid`)
);
CREATE TABLE IF NOT EXISTS `dept` (
`uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(128) NOT NULL,
`company` int(10) unsigned NOT NULL,
`type` int(10) unsigned NOT NULL,
PRIMARY KEY (`uid`)
);
CREATE TABLE IF NOT EXISTS `type` (
`uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(128) NOT NULL,
PRIMARY KEY (`uid`)
);
- Ich konnte das dann natürlich führen Sie eine Abfrage für jede Art und dann nehmen die sich kreuzenden gesetzt... aber das ist nicht sehr elegant!
- Das Feld "Typ" in der Tabelle "dept" ist ein unsigned int(10). Wie kann es mehr als eine Beziehung? Ich weiß, das Komma sepearted Zuordnung, das erfordert aber einen string. Ich kenne auch die 1:n, aber das muss ein extra Feld in der Tabelle geben und nicht sinnvoll-und eine M:N-Beziehung benötigt und extra Tabelle. Überprüfen Sie Ihre TCA-und backend-Einstellung, wenn alles funktioniert es.
- Jede Abteilung hat nur eine Art, also eine einzelne int-Feld ist in Ordnung. Aber ein Unternehmen hat eine oder mehrere Abteilungen. In diesem Sinne, die Tabelle department wird der mn-Tabelle--- Alle Beziehungen in diesem Modell sind in Ordnung. Es geht nur darum, eine query Lösung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie zeigen nicht die weitere Bearbeitung.
Wenn Sie brauchen, UND den Betrieb verwenden Sie diese:
Wenn Sie müssen ODER Betrieb verwenden Sie diese:
HTH
Fand ich heraus, dass $query->contains() funktioniert nur richtig, mit einfachen _mm Tabellen.
Also das ist, was ich getan habe: ich habe gerade einen Blick in die DB hat die erforderlichen Felder für ein _mm Tabelle:
Dann habe ich ein neues Feld dept des TCA von der Unternehmen Tabelle:
Und jetzt habe ich Holen Sie sich die richtigen Ergebnisse für Unternehmen, die Abteilungen geben Einen und Typ B wie dieses: