[Frage] Relationen mit findAll() auslesen

  • 0 x
    26 Beiträge
    0 Hilfreiche Beiträge
    05. 08. 2015, 10:39

    Moin,
    bin gerade dabei eine Extbase Extension zu erstellen und stoße dabei auf folgendes Problem:

    Ich lese mit findAll() alle Models aus meinem Repository aus, weiß aber nicht, wie ich verknüpfte Models mit ausgeben kann.

    Ich habe ein User Model und ein Phone Model. Ein User kann mehrere Phones haben. Die Zuordnung funktioniert soweit auch, ich sehe in der Datenbank die User UID in der Phones Tabelle.

    In meinem Template würde ich gerne in etwa so etwas machen:

    1. <f:for each="{users}" as="user">
    2. Name: {user.name}
    3. <ul>
    4. <f:for each="{user.phones}" as="phone">
    5. <li>{phone.model}</li>
    6. </f:for>
    7. </ul>
    8. </f:for>

    Damit ich so eine Ausgabe habe:

    1. Name: Herbert
    2. <ul>
    3. <li>Apple iPhone 5</li>
    4. <li>Samsung Galaxy S6</li>
    5. </ul>
    6.  
    7. Name: Mathilde
    8. <ul>
    9. <li>Apple iPhone 4S</li>
    10. </ul>

    Hier mal mal Code:
    [b]Phone.php[/b]

    1. <?php
    2.  
    3. namespace Acme\FooBar\Domain\Model;
    4.  
    5. use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
    6.  
    7. class Phone extends AbstractEntity
    8. {
    9. /**
    10.   * @var Acme\FooBar\Domain\Model\User
    11.   */
    12. protected $user;
    13. public function getUser()
    14. {
    15. return $this->user;
    16. }
    17. public function setUser(User $user)
    18. {
    19. $this->user = $user;
    20. }
    21. }

    [b]User.php[/b]

    1. <?php
    2.  
    3. namespace Acme\FooBar\Domain\Model;
    4.  
    5. use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
    6. use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
    7.  
    8. class User extends AbstractEntity
    9. {
    10. /**
    11.   * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Acme\FooBar\Domain\Model\Phone>
    12.   */
    13. protected $phones;
    14.  
    15. /**
    16.   * @return \Acme\FooBar\Domain\Model\User
    17.   */
    18. public function __construct()
    19. {
    20. $this->phones = new ObjectStorage();
    21. }
    22. /**
    23.   * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Acme\FooBar\Domain\Model\Phone>
    24.   */
    25. public function getPhones()
    26. {
    27. return $this->phones;
    28. }
    29. }

    [b]ext_tables.sql[/b]

    1. CREATE TABLE tx_foobar_domain_model_user (
    2. uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
    3. pid int(11) DEFAULT '0' NOT NULL,
    4.  
    5. PRIMARY KEY (uid),
    6. KEY parent (pid),
    7. );
    8.  
    9. CREATE TABLE tx_foobar_domain_model_phone (
    10. uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
    11. pid int(11) DEFAULT '0' NOT NULL,
    12.  
    13. user int(11) DEFAULT '0' NOT NULL,
    14. model text NOT NULL,
    15.  
    16. PRIMARY KEY (uid),
    17. KEY parent (pid),
    18. );

    [b]Configuration/TCA/tx_foobar_domain_model_phone.php[/b]

    1. <?php
    2.  
    3. return [
    4. 'columns' => [
    5. 'user' => [],
    6. 'model' => [],
    7. ],
    8. ];

    [b]Configuration/TCA/tx_foobar_domain_model_user.php[/b]

    1. <?php
    2.  
    3. return [
    4. 'columns' => [
    5. 'phones' => [
    6. 'config' => [
    7. 'config' => [
    8. 'foreign_table' => 'tx_foobar_domain_model_phone',
    9. 'foreign_field' => 'user',
    10. ],
    11. ]
    12. ]
    13. ],
    14. ];

    Die Daten werden einmal nachts aus einem XML eingelesen und werden in keiner Weise im Backend gepflegt, sondern nur über ein Plugin im Frontend ausgelesen.


  • 1
  • daniz78 daniz78
    Sternenflotten-Admiral
    0 x
    226 Beiträge
    0 Hilfreiche Beiträge
    05. 08. 2015, 20:35

    Der Weg ist auf den ersten Blick klar, das Problem aber noch etwas neblig.
    Gibt es eine Fehlermeldung?

    Da Du die $phones im Model als ObjectStorage angelegt hast, kannst Du auch über sie im FLUID iterieren.
    Mach doch mal ein <debug> in der for-each Schleife:

    1. <f:for each="{users}" as="user">
    2. <f:debug>{user.phones}</f:debug>
    3. </f:for>

    Webentwicklung aus Leidenschaft
    https://www.daniz.de

    IT´s not a trick // IT´s passion

  • 0 x
    26 Beiträge
    0 Hilfreiche Beiträge
    06. 08. 2015, 10:16

    Fehlermeldung:

    1. Extbase Variable Dump
    2. NULL

    In meiner Action im Controller steht übrigens nur folgender Code:

    1. $this->view->assign('users', $this->userRepository->findAll());

  • daniz78 daniz78
    Sternenflotten-Admiral
    0 x
    226 Beiträge
    0 Hilfreiche Beiträge
    06. 08. 2015, 13:16

    Ich sehe in der Datenbank die User UID in der Phones Tabelle...

    Aber in der User Tabelle wirst Du nicht die Phone-ID´s sehen!

    In Deiner ext_tables.sql fehlt bei den Persons die Verknüpfung zu den Phones:

    1. CREATE TABLE tx_foobar_domain_model_user (
    2. uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
    3. pid int(11) DEFAULT '0' NOT NULL,
    4. phones text,
    5.  
    6. PRIMARY KEY (uid),
    7. KEY parent (pid),
    8. );

    Es ist ja eine 1:n Verknüpfung, also [b]1[/b] Person kann [b]n[/b] Phones besitzen.

    In Deinem [b]Person[/b] Model muss dann natürlich noch ein paar Methoden eingefügt werden:

    1. public function setPhones();
    2. public function addPhone();
    3. public function removePhone();

    ...der Extension Builder sollte das eigentlich für Dich übernehmen, wenn Du ihn denn nutzt ;)

    Im TCA User.php müsstest Du dann noch die phones konfigurieren:

    Webentwicklung aus Leidenschaft
    https://www.daniz.de

    IT´s not a trick // IT´s passion

  • 1