Zum Inhalt springen

Repository: Query nach cild-object funktioniert nicht.

Erstellt am 25. April 2018 · 7 Antworten · letzte Antwort am 22. Juni 2018

Tags: TYPO3 8, Frage

gidouille ·

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:😮RDER_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?

freeatweb ·

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

gidouille ·

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: #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 ·

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

Grüße
Philipp

gidouille ·

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:😮RDER_DESCENDING));
$query->setLimit(2);
return $query->execute();
}

}

Grüße
gidouille

freeatweb ·

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

gidouille ·

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

gidouille ·

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):

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;
.
.
.

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