2017-07-25 1 views
0

Ich habe folgende DQL-Abfrage:Wie aus einer viele zu viele Beziehung korrekt Datensätze abrufen (Lehre - DQL-Abfrage)

$qb->select('v, b, c, t, p, m, s, f, h') 
    ->from('UrlBuilderBundle:Version', 'v') 
    ->leftJoin('v.ddlBrands', 'b', 'WITH', 'b.version = v.id AND b.isActive = 1 AND v.isActive = 1') 
    ->leftJoin('v.ddlCampaignObjectives', 'c', 'WITH', 'c.version = v.id AND c.isActive = 1') 
    ->leftJoin('v.ddlThemes', 't', 'WITH', 't.version = v.id AND t.isActive = 1') 
    ->leftJoin('t.ddlProducts', 'p', 'WITH', 'p.isActive = 1') 
    ->leftJoin('v.ddlMediums', 'm', 'WITH', 'm.version = v.id AND m.isActive = 1') 
    ->leftJoin('m.ddlSources', 's', 'WITH', 's.ddlMedium = m.id AND s.isActive = 1') 
    ->leftJoin('v.fields', 'f', 'WITH', 'f.version = v.id AND f.isActive = 1') 
    ->leftJoin('f.helpText', 'h', 'WITH', 'h.field = f.id AND h.isActive = 1'); 

$query = $qb->getQuery(); 
$versions = $query->getArrayResult(); 

alle angegebenen Joins zwischen Tabellen, die eine viele zu einem haben/ein zu vielen Beziehungen außer zwischen den Tabellen ddlProducts und ddlThemes. Es gibt eine viele zu viele Beziehung (ddlProducts und ddlThemes), die Probleme verursacht, führt dies zu dem folgenden Fehler:

Error: Maximum execution time of 30 seconds exceeded at /vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php:296)"}

mir jemand kann bei der Lösung dieser Fehler in die richtige Richtung?

+0

der Fehler ist in PHP so müssen Sie php Zeit Executeaion in php.ini max_execution_time –

+1

Ich möchte nicht diesen Weg gehen. Ich möchte die Abfrage optimieren, damit die Ausführung nicht so lange dauert. – Sid

+1

Sie sollten debuggen und überprüfen, ob die Abfrage ordnungsgemäß funktioniert oder nicht ... Dazu vorübergehend hinzufügen => "set_time_limit (0);" Wenn Abfrage erfolgreich ausgeführt wird, dann denke ich, dass wir anschließend optimieren können – Kunal

Antwort

0

Nun, Abfrage und Bestückung Sammlungen von 9 verschiedenen verbundenen Einheiten wird das tun. Aber ohne mehr Wissen über Ihr gesamtes Modell, können wir nicht sagen, was in der Abfrage geändert werden kann.

Vielleicht können Sie versuchen, Tabellen zu finden, die in einen anderen denormalisiert werden können, um den zusätzlichen Join zu vermeiden. Oder vielleicht könnten Sie die Abfrage in mehr teilen, wenn Sie nicht alles in einer Uber-Tabelle benötigen.

Es hängt wirklich davon ab, was Sie brauchen die resultset für

+0

Die Ergebnismenge wird von einem AJAX-Aufruf verwendet, um ausgewählte Elemente in einem Formular aufzufüllen. – Sid

+0

10 In diesem Fall brauchen Sie wahrscheinlich nicht alles in einer großen Tabelle. Sie können die Tabellen in separaten Abfragen abrufen und sie in einem einzelnen Array zurückgeben, um zusätzliche AJAX-Aufrufe zu vermeiden. Sie benötigen wahrscheinlich auch keine vollständigen Objekte. Wählen Sie einfach die gewünschten Felder aus – Dimitris

0

Hyradrate Komplex resultset in Objektbaum ist teuer Betrieb. Wenn die Eingabegröße zunimmt (mehr Zeilen aus der Datenbank) und Sie mehr Entitäten in die Baumstruktur (Viele-zu-Viele-Verknüpfungen) einbinden, benötigt ORM mehr und mehr Zeit, um den Objektbaum zu erstellen. In der Mathematik beschreibt Ihr Problem Bachmann–Landau notation.

Sie können versuchen, so genannte Multi-step Hydration.

Verwandte Themen