Doctrine bringt bei dem selben handgeschriebenen Query zu viele Ergebnisse - Best Practice gesucht

Hallo,

ich möchte in Shopware 5.2 für meine Plugin Entwicklung gerne Doctrine - und zwar nur Doctrine nutzen. Auch deswegen, da ich aus eigener Erfahrung nicht berichten kann, dass Doctrine irgendwie langsamer wäre. Die These, dass man lieber im Frontend nur den DBAL oder plain SQL verwenden soll, weil das schnell ist, ist mir neu. Meiner Meinung nach ist die Datenbank eher der Flaschenhals. Indizies können da mitunter sehr langsam sein (bei ca. 1 Mio. Produkten in MySQL mit ein paar Joins ein paar Minuten mit oder ohne Doctrine).

 

Wie auch immer, jedenfalls funktioniert folgendes Beispiel bestens:

$result = $this->entityManager->getRepository(Detail::class)
            ->findOneBy(array('articleId' => $articleId));

Was eigentlich gleichbedeutend ist mit:

$result = $this->entityManager->createQueryBuilder()
            ->select('article.id, ad.number as ordernumber')
            ->from('\Shopware\Models\Article\Article', 'article')
            ->innerJoin('\Shopware\Models\Article\Detail', 'ad')
            ->where('article.id = :articleId')
            ->getQuery()->execute(array('articleId' => $articleId), AbstractQuery::HYDRATE_ARRAY);

Bei dem 2. Beispiel kommen aber tonnenweise Datensätze zurück, nicht nur meine gesuchte articleID. Weiß jemand, woran das liegt? Das ist jetzt schon der 2. Fall bei dem mir das aufgefallen ist. Auch folgendes geht nicht (richtig):

$articleCollection = $this->entityManager->createQueryBuilder()
            ->select('article.id as articleId, ad.id as articleDetailId')
            ->from('\Shopware\Models\Article\Article', 'article')
            ->innerJoin('\Shopware\Models\Article\Detail', 'ad')
            ->where('articleId = :article_id')
            ->getQuery()->execute(
                array('article_id' => $orderBasket->getArticleId()),
                AbstractQuery::HYDRATE_OBJECT
            );

 

Außerdem bin ich aus der Symfony/Doctrine Welt eher solche nachfolgende Konstrukte gewohnt, bei denen mir aktuell Doctrine Exceptions wirft (vgl. obiges Beispiel):

$articleCollection = $this->entityManager->createQueryBuilder()
            ->select('article.id as articleId, ad.id as articleDetailId')
            ->from('\Shopware\Models\Article\Article', 'article')
            ->innerJoin('\Shopware\Models\Article\Detail', 'ad')
            ->where('articleId = ?', $articleId)
            ->getQuery()->execute(
                array(),
                AbstractQuery::HYDRATE_OBJECT
            );

Hat da jemand eventuell auch eine Idee? Letzteres Beispiel ist aber nur am Rande. Mir geht es in der Hauptsache darum, warum Doctrine bei meinen handgeschriebenen Query, der eigentlich gleichbedeutend mit dem findOneBy ist, zu viele Ergebnisse liefert?

 

 

Danke,

 

derwunner

Ich habe es gefunden. Man muss anscheinend das Tabellen Alias verwenden und kann sich nicht direkt wie oben gezeigt, auf den qualifizierten Klassen Name beziehen:

$queryBuilder = $this->entityManager->createQueryBuilder()
    ->select('ad.id as mainDetailId, adattr.attr1 as productType')
    ->from('\Shopware\Models\Article\Detail', 'ad')
    ->innerJoin('ad.attribute', 'adattr')
    ->where('ad.number = :ordernumber')
    ->setParameter('ordernumber', $ordernumber)
    ->getQuery();
$values = $queryBuilder->getResult(AbstractQuery::HYDRATE_ARRAY);

Weis jemand, ob das an Doctrine liegt, dass das mit den qualifizierten Klassen Namen nicht geht? Denn laut Doctrine Doku müsste das so gehen. Oder liegt das an den Shopware Doctrine Implementierungen?