2017-03-22 4 views
0

Ich möchte 1 Element eine ArrayCollection erhalten. Ich benutze Symfony 2.7.Get-Element von ArrayCollection

Zum Beispiel habe ich eine Sammlung des Unternehmens Aktivität:

$activities = $em->getRepository('AppBundle:Activity')->findAll(); 

Next i 1-Aktivität aus dieser Arraycollection erhalten möchten, basierend auf einer Viele-zu-Eins-Beziehung.

die Entität 'Aktivität':

/** 
* @ORM\Entity(repositoryClass="AppBundle\Repository\ActivityRepository") 
* @ORM\Table(name="activity") 
*/ 
class Activity { 

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

    /** 
    * @ORM\ManyToOne(targetEntity="ObjectElementTask", inversedBy="activities", cascade={"persist"}) 
    * @ORM\JoinColumn(name="objectelementtask_id", referencedColumnName="id", onDelete="CASCADE") 
    */ 
    private $objectelementtask; 

Was habe ich versuche:

$objectElementTask = $em->getRepository('AppBundle:ObjectElementTask')->findOneBy(["active" => 1, "object" => (int)$objectId]);  
$activity = $activities->findBy(['objectelementtask' => $objectElementTask]); 

Ich erhalte die folgende Ausnahme: "Call auf eine Elementfunktion findBy() auf Array"

Ich möchte die Abfrage der Datenbank foreach verhindern.

ich auch versucht:

$activity = array_search($objectElementTask, array_column($activities, 'objectelementtask')); 

Das hat aber kein Ergebnis ...

Vielen Dank im Voraus!

Antwort

1

Es gibt ein paar Dinge, die ich hier sehen kann.

1) Doctrine-Abfragen geben ein Array und keine ArrayCollection zurück. (https://stackoverflow.com/a/8237943/7745506). Deshalb erhalten Sie den Fehler bei findBy. (Ich glaube nicht einmal Arraycollection ein findBy Methode hat hier die API ist und ich sehe es nicht. http://www.doctrine-project.org/api/common/2.3/class-Doctrine.Common.Collections.ArrayCollection.html) Wenn dies ein Arraycollection, könnte Sie in der Lage sein, die Filter-Methode zu verwenden: http://www.doctrine-project.org/api/common/2.3/source-class-Doctrine.Common.Collections.ArrayCollection.html#377-387

2) Wenn Ihre Activity-Klasse hat eine ManyToOne-Beziehung mit der ObjectElementTask-Klasse. Nach Definition kann jede Suche nach einer Aktivität nach ObjectElementTask viele Aktivitäten zurückgeben.

3) Sie sagen, dass Sie die DB nicht in einer foreach abfragen wollen und Sie nicht müssen.

In dieser Situation können Sie die DB für alle Aktivitäten abfragen (sie können aufgrund von Punkt 2 potenziell mehrere sein) für eine bestimmte ObjectElementTask.

$objectElementTask = $em->getRepository('AppBundle:ObjectElementTask')->findOneBy(["active" => 1, "object" => (int)$objectId]); 

$activities = $em->getRepository('AppBundle:Activity')->findBy(['objectelementtask' => $objectElementTask]); 

Dadurch werden alle Aktivitäten zurück, die das ObjectElementTask als ihre objectelementtask haben. Sie müssen danach die gewünschte Aktivität herausfinden, da dies ein Array sein wird.

Verwandte Themen