2013-10-04 27 views
0

我有2個簡單的表有許多到一個單方向的關係:主義和加入結果類型

class Event extends BaseEvent 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 


    /** 
    * 
    * @ORM\ManyToOne(targetEntity="Rposition") 
    * @ORM\JoinColumn(name="owner", referencedColumnName="id",onDelete="CASCADE", nullable=false ) 
    **/ 
    private $owner; 
.... 

和所有者字段類的起源:具有

class Rposition 
{ 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="string", length=36) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="UUID") 
    */ 
    private $id; 


    /** 
    * 
    * 
    * @ORM\Column(name="scenario", type="string", length=255, nullable=false) 
    */ 
    private $scenario; 

兩個班正確的getter/setter和__toString()

我要實現這樣的查詢:

public function findAllByScenario($scenario) { 
     $q = $this->getEntityManager()->createQuery("SELECT e , r.scenario , r.id 
            FROM LapoMymeBundle:Event e 
            JOIN LapoMymeBundle:Rposition r 
            WITH e.owner = r.id 
            WHERE r.scenario = :scenario 
            ORDER BY e.start ASC, e.end ASC 
            ")->setParameter('scenario', $scenario); 
     try { 

      return $q->getResult(); 
     } catch (\Doctrine\ORM\NoResultException $e) { 
      return null; 
     } 

    } 

- 它是進行連接並從中發回結果的正確方法嗎?

- 從對象數組中獲取字段的正確方法是什麼?

這樣的事情是:

$events=$this->getDoctrine()->getManager() 
     ->getRepository('LapoMymeBundle:Event')->findAllByScenario($scenario); 

    $outputUsersArray = Array(); 
    foreach($events as $event) 
    { 
     $eventArray = Array();   

     $eventArray[JSONResponseFields::KEY_ID] = $event->getId(); 
     $eventArray[JSONResponseFields::KEY_NAME] = $event->getOwner()->getId(); 

     $outputEventsArray[] = $eventArray; 
    } .... 

上升錯誤喜歡:

FatalErrorException: Error: Call to a member function getId() on a non-object in..... 
+0

是否有可能並非所有檢索到的事件都擁有一個所有者?就好像'$ event-> getOwner()'是'null'? –

+0

不,可爲空=設置爲false屬性 – JahStation

回答

0

您可以使用Doctrine查詢生成器來得到這個工作。假設你有Querybuilder實例。查詢看起來像

$ qb = this-> getDoctrine() - > getRepository('BundleName:Event') - > createQueryBuilder('e');

$query = $qb 
    ->select('e','p') 
    ->innerjoin('u.owner','r') 
    ->where('r.scenario= :scenario') 
    ->setParameter('scenario', $scenarioid) 
    ->getQuery(); 

$chatuser = $query->getResult();