2016-05-25 15 views
2

Ich brauche ein Filterergebnis von einer vielen zu vielen Beziehung in der Lehre.Doktrin - ManytoMany Filter Ergebnis

Class Users extends RecordItem { 
    /** 
    * @Id @Column(type="integer") @GeneratedValue 
    * @var int 
    **/ 

    protected $id; 
    /** 
    * @ManyToMany(targetEntity="Company") 
    * @JoinTable(name="users_join_company", 
    *  joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@JoinColumn(name="company_id", referencedColumnName="id")} 
    *  ) 
    */ 
    protected $companys; 

    /** 
    * @Column(type="string", length=100) 
    * @var string 
    */ 
    protected $username; 
    //edit - > added array collection - forgotten 
    public function __construct() { 
     $this->companys = new ArrayCollection(); 
    } 
} 

Class Company extends Recorditem { 

    /** 
    * @Id @Column(type="integer") @GeneratedValue 
    * @var int 
    **/ 
    protected $id; 

    /** 
    * @Column(type="string", length=100) 
    * @var string 
    */ 
    protected $company_name; 
} 

so weit ich nur in der Lage bin alle Unternehmen aus dem folgenden Code abzufragen, ist es eine richtige Art und Weise einen Filter hinzufügen? Beispiel: Es gibt drei Unternehmen in Array-Sammlung, möchte man zurück mit angeben Firma „id“

$user = $entityManager->getRepository('Users')->findOneBy(['id'=>1]); 

$companys = $user->companys; // hope to return only company with the id 1 

foreach($companys as $company){ 
    echo $company->company_name; 
} 

Antwort

1

Wenn Sie eine Sammlung, Verwendung Arraycollection filtern ...

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/working-with-associations.html

Beispiel:

// I guess companies is an ArrayCollection 
$myDesiredCompanies = $companies->filter(function (Company $entry) { 
    return ($entry->getId() == 1); 
}); 

Es wird die Sammlung und Rückkehr eine neue Kollektion mit Ihrem gewünschten Ergebnisse

filtern
+0

Ja, Sie haben recht, es ist eine ArrayCollection, die versehentlich das Konstrukt entfernt hat, während sie versuchte, den Code zu vereinfachen. Danke. – WyHowe

0

mit einem Query Builder Sie so etwas wie diese verwenden:

$s_program = $qb->getQuery()->setMaxResults(1)->getOneOrNullResult(); 

In Ihrem Fall versuchen dieser Ersatz:

$user = $entityManager->getRepository('Users')->setMaxResults(1)->getOneOrNullResult(); 

Ich weiß nicht, ob es funktioniert, aber probieren Sie es aus!

+0

getestet und Fehler zurück "Der Methodenname muss entweder mit findBy oder findOneBy beginnen", aber irgendwie verstehen, was die Absicht ist. werde versuchen, das zu umgehen. – WyHowe

0

Ihr Problem ist, dass Unternehmen faul geladen sind und keinerlei Einschränkungen unterliegen. $user->getCompanies() wird immer alle Unternehmen unabhängig zurückgeben.

Sie müssen a) den QueryBuilder verwenden und b) Ihre Entitäten aus der gefilterten Ergebnismenge hydratisieren.

z.

$qb = $this->getEntityManager()->createQueryBuilder(); 
$users = $qb->select('u', 'c') // important - select all entities in query to avoid lazy loading which ignores query constraints 
    ->from('YourBundle:Users', 'u') 
    ->join('u.companys', 'c') 
    ->where('u.id = :userId') 
    ->andWhere('c.id = :companyId') 
    ->setParameter('userId', 1) 
    ->setParameter('companyId', 1) 
    ->getQuery() 
    ->getResult(); 

Diese erhalten Sie alle Benutzer mit der ID 1 (so einem Benutzer) und werden nur Unternehmen holen mit ID 1. passend

Wenn Sie wollen Sie getOneOrNullResult() anstelle von getResult ein holen verwenden könnten Einzelnutzer.