PHP TYPO3 query mm-relation

Schumiel

Lieutenant
Registriert
Jan. 2010
Beiträge
846
Hallo,

ein klassisches Beispiel. Ich habe Mitarbeiter und Gruppen. Nun kann man im Backend jedem Mitarbeiter x-beliebige Gruppen zuweisen.

Nun möchte ich in meinem query ein Join durchführen.

PHP:
$query = $this->createQuery();

$query->matching($query->logicalAnd(...));

return $query->execute();

Dabei möchte ich eine where-Bedingung in mein SQL-Statement packen. Wie ist das mit logicalAND und logicalOr möglich? Denn ich frage in dem MitarbeiterRepository ja nur nach der DB-Tabelle Mitarbeiter. Ich finde dazu keine Doku im Netz. Weiß jemand Rat?
 
Code:
$query = $this->createQuery();

$constraints = [];

if ($search->getVorname() != '') {
    $constraints[] = $query->equals('vorname', $search->getVorname());
}
if ($search->getName() != '') {
    $constraints[] = $query->equals('name', $search->getName());
}

if ( is_object($search->getGruppen()) ) {
      foreach ($search->getGruppen() AS $key => $value) {
        if($value->getUid() != '') {
            $constraints[] = $query->logicalOr( [ $query->equals('gruppen.uid', $value->getUid()) ] );
        }
    }
}

$query->matching($query->logicalAnd($constraints));

return $query->execute();

Ist quasi eine Mitarbeitersuche, indem man bei der Suche über eine Checkbox mehrere Auswahlmöglichkeiten hat. getGruppen bekomme ich daher als Extbase-Objekt (über Model usw.) wieder, wo alle Informationen drin stehen. Vorname und Name kommt aus der Mitarbeitertabelle.

Ich verstehe leider auch die Doku nicht.

https://docs.typo3.org/typo3cms/Ext...vidual-database-queries.html#relation-has-one

Woher nimmt das Beispiel das "author.firstname" her. Oder auch in der 1:n-Beziehung. Wo wird nimmt das Beispiel das "posts.date"? Alles was dann noch unter " Implicit relation cardinality handling " steht, verwirrt mich dann noch viel mehr. Ich sehe da leider kein Schema. :-(
 
getGruppen() gibt dir ein Array von Objekten? Oder wie hast du das erstellt?
getUid() sollte auch nie leer sein bei einem Extbase Objekt das es von AbtractEntity erbt. Zumindest im Normalfall ;-)
Mach mal (Pseudocode)

foreach(getGruppen as gruppen)
constraints[] = $query->logicalOr($query->equals('gruppen', gruppen.uid))

Im Normalfall behandelt Extbase deine Relation und löst diese auf.
 
Über Fluid habe ich mir ein search-Objekt gemacht. Ja, gibt mir ein Array aus dem Objekt zurück. Die Daten kommen auch alle an, was im Suchformular ausgewählt wird.

Mein Problem ist das SQL-Query mit JOINs entsprechend abzufragen.
Leider finde ich auch nirgends eine Doku, wie ich mir das Query, wie es sich zusammensetzt, ausgeben kann. Das würde sicherlich auch helfen.

Edit:
Achso, bekomme dann immer folgenden Fehler:

Could not determine the child object type.
 
Zuletzt bearbeitet:
Auch hier ist doch alles korrekt, oder?

Code:
    /**
     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TEST\Mitarbeiter\Domain\Model\Gruppen>
     */
    protected $gruppen;
    
    protected function initStorageObjects()
    {
        $this->gruppen  = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
    }
    
        /**
     * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TEST\Mitarbeiter\Domain\Model\Gruppen> $gruppen
     */
    public function getGruppen() {
        return $this->gruppen;
    }

    /**
     * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TEST\Mitarbeiter\Domain\Model\Gruppen> $gruppen
     * @return void
     */
    public function setGruppen($gruppen) {
        $this->gruppen = $gruppen;
    }
 
Zeig uns mal die ext_tables.sql.
Am besten wäre es noch, wenn du das TCA von beiden Tabellen hochladen könntest.
 
SQL:
CREATE TABLE tx_mitarbeiter_domain_model_mitarbeiter (
  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
  pid int(11) unsigned DEFAULT '0' NOT NULL,

  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
  crdate int(11) unsigned DEFAULT '0' NOT NULL,
  cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
  deleted tinyint(4) unsigned DEFAULT '0' NOT NULL,
  hidden tinyint(4) unsigned DEFAULT '0' NOT NULL,
  starttime int(11) unsigned DEFAULT '0' NOT NULL,
  endtime int(11) unsigned DEFAULT '0' NOT NULL,

  vorname varchar(255) DEFAULT '' NOT NULL,
  name varchar(255) DEFAULT '' NOT NULL,

sys_language_uid int(11) DEFAULT '0' NOT NULL,
l10n_parent int(11) DEFAULT '0' NOT NULL,
l10n_diffsource mediumblob,

PRIMARY KEY (uid),
KEY parent (pid),
KEY language (l10n_parent,sys_language_uid)
);

CREATE TABLE tx_mitarbeiter_domain_model_gruppen (
  uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
  pid int(11) unsigned DEFAULT '0' NOT NULL,

  tstamp int(11) unsigned DEFAULT '0' NOT NULL,
  crdate int(11) unsigned DEFAULT '0' NOT NULL,
  cruser_id int(11) unsigned DEFAULT '0' NOT NULL,
  deleted tinyint(4) unsigned DEFAULT '0' NOT NULL,
  hidden tinyint(4) unsigned DEFAULT '0' NOT NULL,
  starttime int(11) unsigned DEFAULT '0' NOT NULL,
  endtime int(11) unsigned DEFAULT '0' NOT NULL,

  name varchar(255) DEFAULT '' NOT NULL,
sys_language_uid int(11) DEFAULT '0' NOT NULL,
l10n_parent int(11) DEFAULT '0' NOT NULL,
l10n_diffsource mediumblob,

PRIMARY KEY (uid),
KEY parent (pid),
KEY language (l10n_parent,sys_language_uid)
);

CREATE TABLE tx_mitarbeiter_mitarbeiter_gruppen_mm (
  uid_local int(11) unsigned DEFAULT '0' NOT NULL,
  uid_foreign int(11) unsigned DEFAULT '0' NOT NULL,
  tablenames varchar(30) DEFAULT '' NOT NULL,
  sorting int(11) unsigned DEFAULT '0' NOT NULL,

  KEY uid_local (uid_local),
  KEY uid_foreign (uid_foreign)
);

PHP:
<?php
defined('TYPO3_MODE') or die();

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToInsertRecords('tx_mitarbeiter_domain_model_mitarbeiter');

$tca = [
    'ctrl' => [
        'title' => 'Mitarbeiter',
        'label' => 'name',
        'tstamp' => 'tstamp',
        'crdate' => 'crdate',
        'cruser_id' => 'cruser_id',
        'delete' => 'deleted',
        'enablecolumns' => [
            'disabled' => 'hidden',
            'starttime' => 'starttime',
            'endtime' => 'endtime'
        ],
        'iconfile' => 'EXT:mitarbeiter/Resources/Public/Icons/ext_icon.gif',
        'dividers2tabs' => true,
        'hideAtCopy' => true,
        'searchFields' => 'title'
    ],
    'interface' => [
        'showRecordFieldList' => 'vorname,name'
    ],
    'columns' => [
        'vorname' => [
            'exclude' => 0,
            'label' => 'Vorname',
            'config' => [
                'type' => 'input',
                'size' => 30,
                'eval' => 'required,trim'
            ],
        ],
        'name' => [
            'exclude' => 0,
            'label' => 'Name',
            'config' => [
                'type' => 'input',
                'size' => 30,
                'eval' => 'required,trim'
            ],
        ]
    ],
    'types' => [
        // Single event
        '0' => [
            'showitem' =>
                '--div--;Allgemein, vorname, name'
        ]
    ],
];

return $tca;
PHP:
<?php
defined('TYPO3_MODE') or die();

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToInsertRecords('tx_mitarbeiter_domain_model_gruppen');

$tca = [
    'ctrl' => [
        'title' => 'Gruppen',
        'label' => 'name',
        'tstamp' => 'tstamp',
        'crdate' => 'crdate',
        'cruser_id' => 'cruser_id',
        'delete' => 'deleted',
        'enablecolumns' => [
            'disabled' => 'hidden',
            'starttime' => 'starttime',
            'endtime' => 'endtime'
        ],
        'iconfile' => 'EXT:mitarbeiter/Resources/Public/Icons/ext_icon.gif',
        'dividers2tabs' => true,
        'hideAtCopy' => true,
        'searchFields' => 'title'
    ],
    'interface' => [
        'showRecordFieldList' => 'name'
    ],
    'columns' => [
        'name' => [
            'exclude' => 0,
            'label' => 'Name',
            'config' => [
                'type' => 'input',
                'size' => 30,
                'eval' => 'required,trim'
            ],
        ]
    ],
    'types' => [
        // Single event
        '0' => [
            'showitem' =>
                '--div--;Allgemein, name'
        ]
    ],
];

return $tca;
 
Ich habe es komplett von Hand gebaut.
Aber auch wenn ich die Relationsfelder hinzufüge, weiß ich nicht, was in die WHERE-Abfrage muss, wie in meinen Beitrag, aus der Doku zitierend, geschrieben.
 
Zurück
Oben