2016-03-22 17 views
0

Ich habe google für Stunden jetzt gesucht und ich kann nicht scheinen, die Antwort zu finden, die ich suche. In Symfony2 versuche ich Criteria :: create() zu verwenden und auf eine Saison zu filtern, und es funktioniert nicht. Hier ist die vollständige Erklärung:symfony2 Filtern nach verwandten Entitäten mit Entitäten

Ich habe 4 Entitäten: Benutzer, UserPolicy, Rolle und Saison. UserPolicy implementiert das RoleInterface und User implementiert das UserInterface.

User.php

class User implements UserInterface, \Serializable { 

    /** 
    * @OneToMany(targetEntity="UserPolicy", mappedBy="User", cascade={"persist", "remove"}) 
    */ 
    private $Polocies; 

} 

UserPolicy.php

Role.php

class Role{ 

    /** 
    * @Id 
    * @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @Column(name="role", type="string", length=50) 
    */ 
    private $Role; 

    /** 
    * @Column(name="label", type="string", length=50) 
    */ 
    private $Label; 

    /** 
    * @ManyToOne(targetEntity="Role") 
    * @JoinColumn(name="parentId", referencedColumnName="id", nullable=true) 
    */ 
    private $Parent; 
} 

Beachten Sie die $ Saison Variable auf der UserPolicy.

Jedes Jahr wird es eine neue Saison geben, und die Benutzer werden eine neue Reihe von Richtlinien erhalten, die die Richtlinien der Vorsaison beibehalten.

In User.php muss ich getRoles() aufrufen, was funktioniert und ich kann die UserPolicies bekommen, die die Rollen an sie gebunden haben und das funktioniert auch.

Das Problem wird eingeführt, wenn ich auf den Jahreszeiten filtern muss. Ich fand die Kriterien Klasse:

$criteria = Criteria::create() 
      ->where(Criteria::expr()->eq("Season", "1")); 

Aber weil Saison ein Objekt ist, erhalte ich die Fehler

Cannot match on AppBundle\Entity\UserPolicy::Season with a non-object value. Matching objects by id is not compatible with matching on an in-memory collection, which compares objects by reference. 

Wie kann ich die Saison Objekt holen, wenn ich nicht soll ich in der Lage sein andere Daten in der Benutzereinheit laden? Ich weiß nicht, wie ich das Saisonobjekt passieren soll. Ich habe sogar einen Dienst erstellt, um auf das Saisonobjekt zuzugreifen, aber ich kann nicht auf die Funktion get() innerhalb der Entität zugreifen. HILFE!

Antwort

1

Ich fand this question, die ein ähnliches Problem zu Ihrem beschreibt. Es ist nicht möglich, die Kriterien in der von Ihnen beschriebenen Weise zu verwenden.

So gibt es drei Lösungen:

  1. die gesamte Kollektion holen und sie dann nach Saison filtern wie in the question I mentioned earlier.

  2. Erstellen Sie eine Repository-Methode zum Abrufen von Benutzerrichtlinien nach Saison-ID.

  3. Rufen Sie zuerst die Saison ab und verwenden Sie sie dann in der Standardmethode findBy() des Entitätsrepositorys.

Hoffe, das hilft.

+0

Die Optionen 2 und 3 sind hilfreich, aber das Problem ist auf der getRoles, die für die Benutzeroberfläche erforderlich ist. Ich kann keine Repository-Methode innerhalb der Entität verwenden und keine andere Entität innerhalb einer Entität abrufen. – chollan

+0

In diesem Fall denke ich, die einfachste Lösung wäre, mit Option eins zu gehen und die Richtlinien in 'getRoles()' Methode zu filtern. Wenn Sie nicht wissen, wie viele dieser Richtlinien, wird es kein Problem sein, die Leistung. –

+0

Ich mag Option eins und es macht viel Sinn.Bei der Implementierung merke ich jedoch, dass das If von 1 hart codiert war. Gibt es eine Möglichkeit, auf eine globale Variable zuzugreifen, in die ich die Saison seit ihrer eigenen Einheit einfügen könnte? – chollan

Verwandte Themen