2016-12-28 2 views
0

Ich habe zwei Modelle, die miteinander verwandt sind:Symfony 3/Lehre: Sortierung nach nicht-persistent Spalten

class Product 
{ 
    //... 

    /** 
    * @var Collection<Key> 
    * One Product has Many Keys. 
    * @ORM\OneToMany(targetEntity="Key", mappedBy="product") 
    */ 
    private $keys; 

    public function getKeyNumber() 
    { 
     return count($this->keys); 
    } 

    //... 
} 

class Key 
{ 
    //... 

    /** 
    * @var Product 
    * 
    * Many Keys have One Product. 
    * @ORM\ManyToOne(targetEntity="Product", inversedBy="keys") 
    * @ORM\JoinColumn(referencedColumnName="id") 
    */ 
    private $product; 

    /** 
    * @var int 
    * @ORM\Column(type="integer") 
    */ 
    private $product_id; 

    //... 
} 

Ich bin in der Lage, die Anzahl der Tasten mit Product::getKeyNumber() zu bekommen. Jetzt möchte ich diesen Wert zum Sortieren in der Abfrage verwenden.

Ich habe versucht, so etwas wie, dass (DQL Query):

SELECT a, COUNT(a.keys) AS keyNumber FROM AppBundle\Entity\Product a ORDER BY keyNumber ASC; 

, die zurückgibt:

[Semantical Error] line 0, col 18 near 'keys) AS keyNumber': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected. 

Wenn ich versuche:

SELECT a FROM AppBundle\Entity\Product a ORDER BY count(a.keys) ASC 

heißt es:

[Syntax Error] line 0, col 50: Error: Expected known function, got 'count' 

Irgendwelche Ideen? :)

Danke.

Antwort

1

Sie können versuchen, so etwas wie dies zu tun (nur eine Idee, nicht ein verifizierter Code)

SELECT a, COUNT(b.id) AS keyNumber FROM AppBundle:Product a JOIN a.keys b ORDER BY keyNumber ASC; 

Sobald COUNT() erwartet Einzelwertefeld können Sie explizit die Tasten Tisch sitzen und zählen auf etwas in ihm (Ich nehme an, es hat ID oder Sie können verwenden, was auch immer da ist).

+0

Scheint zu arbeiten, ich musste nur hinzufügen "GROUP BY a.id". ;) Dies ist die DQL-Abfrage, mit der ich endete: 'SELECT a, COUNT (b.id) AS Schlüsselnummer FROM AppBundle: Produkt a INNER JOIN a.schlüssel b GROUP BY a.id ORDER BY Schlüsselzahl ASC'. Aus irgendeinem seltsamen Grund funktioniert das nicht: 'SELECT a FROM AppBundle: Produkt a INNER JOIN a.Tasten b GROUP BY a.ID ORDER BY COUNT (b.id) ASC' – saitho

+0

Ich bin froh, dass es für Sie gearbeitet hat. Die DQL ist nicht so fortgeschritten wie SQL, daher denke ich, dass der Fall mit der Funktion in der Order-Klausel nicht implementiert ist (noch?). – Stepashka

0

Ich frage mich, ob es mit Composite-Tasten zu tun hat? Ich habe etwas darüber gelesen. Ich weiß nicht, was Ihre Schlüsselkennung ist, aber ich zeige unten a.id. Können Sie dies versuchen:

SELECT IDENTITY(a.id), a, COUNT(a.keys) AS keyNumber FROM AppBundle:Product a ORDER BY keyNumber ASC 

Hinweis, habe ich AppBundle \ Entity \ Artikel einfach AppBundle reduziert: Das Produkt und wurde am Ende des Semikolons befreien.

Lassen Sie mich wissen, wenn das funktioniert, kann es nicht.

+0

Nein, funktioniert nicht. :/'[Semantischer Fehler] Zeile 0, Spalte 18 nahe 'ID), a, COUNT (a.Tasten)': Fehler: Ungültiger Pfadausdruck. Muss ein SingleValuedAssociationField sein. Aber danke für deine Antwort. :) – saitho