[Frage] Extbase N:M Relation mit Attributen [Gelöst]


  • 0 x
    11. 02. 2014, 11:07

    Hallo miteinander,

    ich habe versucht nach diesem Tutorial hier [url]http://blog.undkonsorten.com/datenbankrelationen-typo3-irre-extension[/url] eine N:M Relation mit Attributen herzustellen. So gesehen habe ich gerade mal versucht, den gegebenen Code dort zum laufen zu bringen.

    Im Backend läuft auch alles, alle Relationen und Datensätze können erstellt werden und werden auch richtig in der Datenbank gespeichert.

    Mein Problem ist jetzt allerdings: Wie arbeite ich weiter mit diesen Daten ?
    Wenn ich ein Model/Controller/Repository/Plugin erstelle, um mir alle Firmen ausgeben zu lassen, erhalte ich immer eine SQL Fehlermeldung. Scheinbar versucht Extbase die mitarbeiterid bzw firmaid nicht aus der Relationstabelle, sondern direkt aus der Mitarbeiter- bzw. Firmentabelle zu lesen. Dort gibt es dieses Attribut natürlich nicht, was zum Fehler führt.

    Hat jemand von euch eine Idee, was noch getan werden muss, damit Extbase beim Repository Request auf die richtige (die Relations-)Tabelle zugreift, bzw. wie ich ansonsten mit den Daten arbeiten kann/soll/muss ?
    Wie gesagt, in der Datenbank wird alles richtig zugeordnet und läuft bestens. :(

    Vielen Dank im voraus!

  • Schweriner Schwerine...
    Jedi-Ratsmitglied
    0 x
    554 Beiträge
    60 Hilfreiche Beiträge
    11. 02. 2014, 17:11 - Lösung

    Warum erstellst Du eigentlich überhaupt ein Repository zur Ausgabe aller Firmen? Gibt es zu den Firmen kein Repository bei dem Du mit findAll alle ausgeben kannst?

    "Wenn ich ein Model/Controller/Repository/Plugin erstelle, um mir alle Firmen ausgeben zu lassen, erhalte ich immer eine SQL Fehlermeldung."


  • 1
  • Schweriner Schwerine...
    Jedi-Ratsmitglied
    0 x
    554 Beiträge
    60 Hilfreiche Beiträge
    11. 02. 2014, 14:00

    In dem Model muss das Attribut für die untergeordnete Tabelle als ObjectStorage deklariert werden.


  • 0 x
    11. 02. 2014, 16:23

    Das habe ich auch so gemacht.

    1. <?php
    2. namespace sb\Clustertest\Domain\Model;
    3.  
    4. /***************************************************************
    5.  * Copyright notice
    6.  *
    7.  * (c) 2014
    8.  * All rights reserved
    9.  *
    10.  * This script is part of the TYPO3 project. The TYPO3 project is
    11.  * free software; you can redistribute it and/or modify
    12.  * it under the terms of the GNU General Public License as published by
    13.  * the Free Software Foundation; either version 3 of the License, or
    14.  * (at your option) any later version.
    15.  *
    16.  * The GNU General Public License can be found at
    17.  * http://www.gnu.org/copyleft/gpl.html.
    18.  *
    19.  * This script is distributed in the hope that it will be useful,
    20.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    21.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    22.  * GNU General Public License for more details.
    23.  *
    24.  * This copyright notice MUST APPEAR in all copies of the script!
    25.  ***************************************************************/
    26.  
    27. /**
    28.  *
    29.  *
    30.  * @package clustertest
    31.  * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later
    32.  *
    33.  */
    34. class Hotel extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
    35.  
    36. /**
    37. * title
    38. *
    39. * @var \string
    40. */
    41. protected $title;
    42.  
    43. /**
    44. * offers
    45. *
    46. * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Sb\Clustertest\Domain\Model\Offer>
    47. */
    48. protected $offers;
    49.  
    50. /**
    51. * __construct
    52. *
    53. * @return Hotel
    54. */
    55. public function __construct() {
    56. //Do not remove the next line: It would break the functionality
    57. $this->initStorageObjects();
    58. }
    59.  
    60.  
    61. /**
    62. * Initializes all ObjectStorage properties.
    63. *
    64. * @return void
    65. */
    66. protected function initStorageObjects() {
    67. /**
    68. * Do not modify this method!
    69. * It will be rewritten on each save in the extension builder
    70. * You may modify the constructor of this class instead
    71. */
    72. $this->offers = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
    73. }
    74.  
    75. /**
    76. * Returns the title
    77. *
    78. * @return \string $title
    79. */
    80. public function getTitle() {
    81. return $this->title;
    82. }
    83.  
    84. /**
    85. * Sets the title
    86. *
    87. * @param \string $title
    88. * @return void
    89. */
    90. public function setTitle($title) {
    91. $this->title = $title;
    92. }
    93.  
    94. /**
    95. * Returns the offers
    96. *
    97. * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Sb\Clustertest\Domain\Model\Offer> $offers
    98. */
    99. public function getOffers() {
    100. return $this->offers;
    101. }
    102.  
    103. /**
    104. * Sets the offers
    105. *
    106. * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Sb\Clustertest\Domain\Model\Offer> $offers
    107. * @return void
    108. */
    109. public function setOffers(\sb\Clustertest\Domain\Model\Offer $offers) {
    110. $this->offers = $offers;
    111. }
    112.  
    113. }
    114. ?>

    Bei Offer.php eben genau andersrum. Funktioniert leider trotzdem nicht. Scheint generell nicht so zu funktionieren. Schade.

  • Schweriner Schwerine...
    Jedi-Ratsmitglied
    0 x
    554 Beiträge
    60 Hilfreiche Beiträge
    11. 02. 2014, 16:41

    Dein Namespace oben ist klein geschrieben, in den ObjectStorages aber groß (\Sb\). Weiß zwar nicht ob das schlimm ist, aber sicher, dass das so gehört?


  • 0 x
    11. 02. 2014, 16:47

    Als ich den Namespace in den ObjectStorages kleingeschrieben hatte, hat Extbase gemeckert. Groß ging es dann ( bis zum SQL Error ). Das hab ich leider schon öfter beobachtet, dass Extbase da merkwürdig ist mit dem Namespace ;)

    Zur Vollständigkeit hier mal der SQL-Error:

    1. #1247602160: Unknown column 'tx_clustertest_domain_model_offer.hotelid' in 'where clause': SELECT tx_clustertest_domain_model_offer.* FROM tx_clustertest_domain_model_offer WHERE tx_clustertest_domain_model_offer.hotelid = '1' AND tx_clustertest_domain_model_offer.deleted=0 AND tx_clustertest_domain_model_offer.t3ver_state<=0 AND tx_clustertest_domain_model_offer.pid<>-1 AND tx_clustertest_domain_model_offer.hidden=0 AND tx_clustertest_domain_model_offer.starttime<=1392133920 AND (tx_clustertest_domain_model_offer.endtime=0 OR tx_clustertest_domain_model_offer.endtime>1392133920) ORDER BY tx_clustertest_domain_model_offer.hotelsort ASC

  • Schweriner Schwerine...
    Jedi-Ratsmitglied
    0 x
    554 Beiträge
    60 Hilfreiche Beiträge
    11. 02. 2014, 17:11

    Warum erstellst Du eigentlich überhaupt ein Repository zur Ausgabe aller Firmen? Gibt es zu den Firmen kein Repository bei dem Du mit findAll alle ausgeben kannst?

    "Wenn ich ein Model/Controller/Repository/Plugin erstelle, um mir alle Firmen ausgeben zu lassen, erhalte ich immer eine SQL Fehlermeldung."


  • 0 x
    11. 02. 2014, 17:19

    Ich nutze das standardmäßig vom Extension Builder miterstellte Repository, das in der Regel leer ist. Zur Testausgabe nutze ich genau die Funktion findAll(). Bei genau dieser, von Extbase Standardmäßig implementierten Funktion, wirft Extbase mir ja den SQL-Fehler.

    Nebenbei, um der Verwirrung vorzubeugen: Der Code ist nun mit Hotels/Offers aus dem IRRE_Tutorial ausgestattet, nicht mehr mit Mitarbeitern und Firmen ;) Das Prinzip bleibt aber gleich.
    Leider hört das IRRE_Tutorial bei der TCA Konfiguration auf ( und die funktioniert soweit ), daher muss ich mir die Models/Controller und Co. ja irgendwie selbst erstellen. Bloß bei der Ausgabe haperts dann eben. Und ich brauche doch ein Model/Controller Set um die Daten vernünftig auszugeben, oder bin ich grad einfach zu blind ?


  • 0 x
    11. 03. 2014, 16:27

    Ich muss das hier leider nochmal hochholen, da ich nach wie vor keine Lösung für das Problem finden konnte und so langsam echt am verzweifeln bin. Ich fass dann nochmal kurz die Problematik zusammen:

    - Im Backend funktionieren die Relationen, die Datenbank sieht auch sauber aus.
    - Sobald ich eine Frontendausgabe per repository->findAll() erzeugen möchte, tritt o.g. SQL-Fehler auf. ( er scheint die Spalte aus der Relationstabelle in der Firmen/Hotel bzw Angebot/Mitarbeiter Tabelle zu suchen... warum auch immer !? )

    Entweder scheint da wirklich irgendwo der Wurm drin zu sein, was die Bezeichner der foreign_field's etc. angeht ( was aber merkwürdig wäre, denn im Backend wird die Relation ja richtig dargestellt.. ) oder kann es sein, dass ich für diese Art von N:M Relation nicht drumherum komme, den RepositoryRequest selbst zu schreiben? ( was ja auch prinzipiell quatsch ist, warum kann Extbase die Verknüpfung in der Datenbank herstellen bzw. richtig schreiben, aber beim lesen dann diese Relation nicht vernünftig auflösen ? )

  • maxhb maxhb
    Flash Gordon
    0 x
    2148 Beiträge
    0 Hilfreiche Beiträge
    18. 06. 2015, 08:53

    Hallo!
    Hat mittlerweile jemand eine Lösung für das Problem gefunden? Scheitere im Prinzip an der selben Stelle, die TCA-Konfiguration funktioniert tadellos, wenn man die Datensätze über das BE von TYPO3 bearbeitet, aber alle Abfragen per Extbase scheitern bzw. liefern keine Ergebnisse für die Relation.

    Würde mich freuen, wenn jemand eine Lösung parat hat, denn MM-Relationen mit Attribut sind schon ein wichtiges Mittel zur Datenmodellierung.

    CU
    maxhb

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    18. 06. 2015, 13:36

    Hallo zooloohed,

    ist zwar schon ein paar Tage her, aber ich schreib mal, was mir noch ein- oder aufgefallen ist.
    Auch wenn es oben schon erwähnt wurde...

    Der Namespace beginnt mit kleinem sb in Zeile 2 und in Zeile 109 - überall sonst Sb.

    Und wo ich grad in Zeile 109 bin...
    der Parameter muss ein ObjectStorage sein (wie im comment Z.106 richtig angegeben). Hier (Z.109) steht aber nur (\sb\Clustertest\Domain\Model\Offer $offers)

    .

    Jetzt hab ich mir nochmal dieses Tutorium angeschaut, weil
    ich hab zwar "M:N mit Attributen" schon realisiert, allerdings war diese Relation dann eine eigene Entität und hatte einen Verweis auf ein ValueObject. Ich hab also M:N in M:1-1:N aufgetrennt (3.Normalform, wenn ich nicht irre).
    Analog zum Tutorial-Beispiel hätte ich dann keine Tabelle tx_myext_mitarbeiter_firma_mm, sondern eine tx_myext_domain_model_vertrag und diese referenziert meine ValueObject-Tabelle tx_myext_domain_model_position.

    Allerdings steht in dem Tutorial ja auch
    [i]"Man sieht jetzt schon das die Relationstabelle nicht mehr klassisch aufgebaut ist , sondern wie eine ganz normale „Datensatz“-Tabelle."[/i]
    ...und erkenne ganz nebenbei, daß es sich dort gar nicht um Extbase-Tabellen handelt.
    Also z.B. nur tx_ukdbtutorial_firma anstatt tx_ukdbtutorial_domain_model_firma.

    Gruß
    Harald

  • 1