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