[Frage] Repository: Query nach cild-object funktioniert nicht. TYPO3-Version: 8.7.10

  • 0 x
    18 Beiträge
    0 Hilfreiche Beiträge
    25. 04. 2018, 10:03

    Hallo zusammen,

    ich habe das Problem, dass ich eine Fehlermeldung bekomme, wenn ich im Repository nach einem Kind-Objekt suche.

    Ich habe schon alles mögliche ausprobiert und als Fehler ausgeschlossen, mein code entspricht genau dieser Passage in der Dokumentation:
    https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/3-implement-individual-database-queries.html#implicit-relation-cardinality-handling

    Auf die Kardinalität kommt es bei mir gar nicht an, die Zeile

    $query->matching($query->greaterThan('event.date', $GLOBALS['EXEC_TIME']));

    führt immer zur Fehlermeldung:

    Oops, an error occurred!
    Could not determine the child object type.

    Wenn ich das SQL-Statement selbst schreibe, als

    $query->statement("mein SQL-Befehl");

    funktioniert alles bestens, daran liegts also nicht. Ich würde es einfach so machen, aber dann kann ich die Resultate nicht mehr sortieren. Nach dieser Zeile zeigt sowas wie

    $query->setOrderings(array('event.date' => QueryInterface::ORDER_DESCENDING));
    $query->setLimit(2);

    keinerlei Wirkung mehr. Aber auch keine Fehlermeldung wie oben mehr. Auch dafür habe ich keine Erklärung.

    Weiß irgend jemand Rat?


  • 1
  • freeatweb freeatweb
    Jedi-Meister
    0 x
    251 Beiträge
    4 Hilfreiche Beiträge
    25. 04. 2018, 13:37

    Hallo,

    sieht eher nach einem Fehler im Domain-Model aus.
    Wie ist hier das Child-Object eingebunden?

    Laut Fehlermeldung dürfte hier der falsche Object Type verwendet werden.

    Lg

  • 0 x
    18 Beiträge
    0 Hilfreiche Beiträge
    25. 04. 2018, 15:31

    Im Domain Modell des Elternteils ist das Child-Object eingebunden mit

    use Gidouille\MyExtension\Domain\Model\Event;

    ebenso im Repository. Aber das hilft nichts. Oder die Art der Einbindung ist falsch. Meine Vermutungen gehen genau dahin. Wo und wie mache ich dem Elternteil das Kind bekannt? In der oben erwähnten Dokumentation war diese Einbindung wohl noch nicht nötig.

    Die Struktur meiner Daten ist ganz ähnlich wie bei Dennis mit seinen Studiengängen: https://www.typo3.net/forum/thematik/zeige/thema/126694/

    Es gibt Programmpunkte mit einer MN-Relation zu Events. Im TCA der Programmpunkte werden die Events, an denen der Programmpunkt stattfindet, eingetragen. Im TCA der Events fehlt das Feld für Programmpunkte.
    Genau wie bei Dennis. Zitat: "Im Studiengang selbst soll man die Person aber nicht wählen können/müssen - das wäre doppelte arbeit." Genau. Und nicht nur das, es wäre auch eine schlimme Fehlerquelle!

    Die Query soll jetzt alle Programmpunkte finden, die (mindestens)ein Event haben, dessen Datum in der Zukunft liegt.

    lg

  • pstranghoener pstrangho...
    Die Macht
    0 x
    504 Beiträge
    22 Hilfreiche Beiträge
    08. 05. 2018, 07:30

    Hey gidouille,
    hast du schon eine Lösung? Sonst würde ich mir das Ganze nochmal genauer anschauen.

    Grüße
    Philipp

  • 0 x
    18 Beiträge
    0 Hilfreiche Beiträge
    14. 05. 2018, 22:29

    Hallo Phillipp,
    nein, leider immer noch nicht. Ich bin nach wie vor ratlos und für jeden Lösungsvorschlag dankbar!

    Hier ist mein code:

    class ProgrammRepository extends \TYPO3\CMS\Extbase\Persistence\Repository

    {

    protected $defaultOrderings = array(
    );

    /**
    *
    */
    public function findByEvent()
    {
    $query = $this->createQuery();
    // $query->matching($query->greaterThan('event.date', $GLOBALS['EXEC_TIME'])); // Diese Zeile erzeugt eine Fehlermeldung

    // mit direktem SQL-Statement funktioniert es einwandfrei:
    $query->statement("SELECT * FROM tx_gidouilleevent_domain_model_programm
    WHERE UID IN
    (SELECT DISTINCT uid_local FROM tx_gidouilleevent_programm_event_mm
    INNER JOIN tx_gidouilleevent_domain_model_event
    ON (tx_gidouilleevent_domain_model_event.uid = tx_gidouilleevent_programm_event_mm.uid_foreign)
    WHERE tx_gidouilleevent_domain_model_event.date >= ".$GLOBALS['EXEC_TIME'].")");

    // aber dann zeigen orderings und limits keine Wirkung mehr:
    $query->setOrderings(array('event.date' => \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_DESCENDING));
    $query->setLimit(2);
    return $query->execute();
    }

    }

    Grüße
    gidouille

  • freeatweb freeatweb
    Jedi-Meister
    0 x
    251 Beiträge
    4 Hilfreiche Beiträge
    23. 05. 2018, 11:03

    Hallo,

    ich glaube, dass setLimit() und setOrderings() in Kombination mit statement() - also einem indivuellem SQL-Query nicht funktionieren.

    Warum setzt du LIMIT und ORDER BY nicht direkt im SQL-Statement?

    Lg

  • 0 x
    18 Beiträge
    0 Hilfreiche Beiträge
    01. 06. 2018, 18:10

    Hallo freeatweb

    danke! Auf die Idee war ich blöderweise gar nicht gekommen.

    Als Notlösung erstmal brauchbar, aber wenn man dann noch Werte aus den BE settings übernehmen will, wird das SQL-statement ziemlich komplex.... ;)

    besser wäre sicher, das child-object richtig einzubinden.

    LG

  • 0 x
    18 Beiträge
    0 Hilfreiche Beiträge
    22. 06. 2018, 16:44

    Hallo zusammen,
    lang hat's gedauert, aber jetzt habe ich endlich die Lösung:

    Das Kind-Objekt muss im Modell des Eltern-Objekts als param eingetragen werden. In meinem Fall also (in Classes\Domain\Model\Programm.php):

    [code]abstract class Programm extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
    {
    /**
    * The events of this programm
    *
    * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Gidouille\GidouilleEvent\Domain\Model\Event>
    * @param \Gidouille\GidouilleEvent\Domain\Model\Event $event
    *
    * __construct
    */

    protected $event;
    .
    .
    .
    [/code]

    Danach funzt es einwandfrei!
    Eine genauere Erklärung findet sich hier: https://docs.typo3.org/typo3cms/ExtbaseFluidBook/3-BlogExample/7-Paths-on-the-Data-Map.html

    Der Ansatz mit dem SQL-Statement war ein interessanter Versuch, aber keine wirklich Lösung.

    Viele Grüße
    gidouille

  • 1