Zum Inhalt springen

m:n-Relation mit Property in _mm-Table (Extension Builder)

Erstellt am 8. März 2018 · 3 Antworten · letzte Antwort am 13. März 2018

Tags: TCA, Frage

chris_m ·

Ziel:
Es gibt Kunden und Seminare, jeder Kunde kann mehrere Seminare buchen, jedes Seminar kann mehrere Kunden haben. Dazu habe ich im Extension Builder zwischen Kunde und Seminar eine m:n-Relation angelegt und alles funktioniert perfekt.

Nun möchte ich ein Attribut / Property für "Seminargebühr bezahlt" ('paid') verwenden. Der Logik nach, sollte das in die _mm-Tabelle zur entsprechenden Relation zwischen Kunde und Seminar.

Dies wird vom Extension Builder so nicht unterstützt, und die Informationen, die ich zu diesem Thema gefunden habe, bieten keine Lösung bzw. sind nicht mehr aktuell.

Kann mich jemand in die richtige Richtung für eine Lösung stoßen?

chris_m ·

Hallo Philipp, danke für Deine Rückfrage!

Seminarverwaltung: Ein Kunde kann mehrere Seminare buchen und eine Seminar kann mehrere Kunden haben.

Model\Kunde.php

...

/**
     * Name
     *
     * @var string
     * @validate NotEmpty
     */
    protected $name = '';

/**
     * Seminare, die der Kunde gebucht hat
     *
     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Seminarext\Domain\Model\Seminar>
     * @lazy
     */
    protected $seminare = null;
...

\Model\Seminar.php

...

/**
     * Name
     *
     * @var string
     * @validate NotEmpty
     */
    protected $name = '';
    
...

TCA Kunde

...

'seminare' => [
            'exclude' => false,
            'label' => 'LLL:EXT:seminarext/Resources/Private/Language/locallang_db.xlf:tx_seminarext_domain_model_kunde.seminare',
            'config' => [
                'type' => 'select',
                'renderType' => 'selectMultipleSideBySide',
                'foreign_table' => 'tx_seminarext_domain_model_seminar',
                'MM' => 'tx_seminarext_kunde_seminar_mm',
                'size' => 10,
                'autoSizeMax' => 30,
                'maxitems' => 9999,
                'multiple' => 0,
                'fieldControl' => [
                    'editPopup' => [
                        'disabled' => false,
                    ],
                    'addRecord' => [
                        'disabled' => false,
                    ],
                    'listModule' => [
                        'disabled' => true,
                    ],
                ],
            ],
...

SQL der _mm-Tabelle

SQL

#
# Table structure for table 'tx_seminarext_kunde_seminar_mm'
#
CREATE TABLE tx_seminarext_kunde_seminar_mm (
	uid_local int(11) unsigned DEFAULT '0' NOT NULL,
	uid_foreign int(11) unsigned DEFAULT '0' NOT NULL,
	sorting int(11) unsigned DEFAULT '0' NOT NULL,
	sorting_foreign int(11) unsigned DEFAULT '0' NOT NULL,

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

Diese Intermediate Table wird vom Extension Builder bei m:n-Relationen automatisch erstellt.

Der Kunde bucht ein Seminar, das mit

public function addSeminar(\Vendor\Seminarext\Domain\Model\Seminar $seminar)
    {
        $this->seminare->attach($seminar);
    }

mit dem Kundendatensatz verlinkt wird.

Ziel ist es nun in der tx_seminarext_kunde_seminar_mm-Tabelle ein Feld zu erstellen ("bezahlt"), das angibt, ob der Kunde die Gebühr für dieses Seminar bezahlt hat. Von der Logik her gehört dieses Attribut zur Relation "Kunde-Seminar" und passt weder zu Kunde noch zu Seminar.
(Wenn das prinzipiell funktioniert, sollten noch weitere Felder, z.B. das Datum der Zahlung mit rein.)

chris_m · · Beste Antwort

Nach weiterer Recherche ist der Ansatz, Informationen in die _mm-Tabelle zu schreiben, nach meinem Verständnis nicht "korrekt" im Sinne des DDD und wird damit nicht richtig von Extbase unterstützt. Daher habe ich die m:n-Beziehung aufgelöst und noch eine Entity "Seminarbuchung" eingeführt, die zwischen Kunde und Seminar steht und die die zusätzlichen Daten enthält.