2016-07-24 66 views
2

我正在创建symfony的web应用程序,并有问题与适当的dql查询收件箱。 这是实体导致问题的代码:Symfony一对多的查询

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

/** 
* @OneToOne(targetEntity="User") 
* @JoinColumn(name="fromUser", referencedColumnName="id") 
*/ 
protected $fromUser; 

/** 
* @ORM\Column(type="text") 
*/ 
protected $fromEmail; 

/** 
* @return mixed 
*/ 

/** 
* @OneToOne(targetEntity="User") 
* @JoinColumn(name="toUser", referencedColumnName="id") 
*/ 
protected $toUser; 


/** 
* @ORM\Column(type="text",length=255) 
*/ 
protected $subject; 

/** 
* @ORM\Column(type="datetimetz") 
*/ 
protected $date; 



/** 
* @ORM\Column(type="text") 
*/ 
protected $toEmail; 

/** 
* @ORM\Column(type="text") 
*/ 
protected $content; 


/** 
* @ORM\Column(type="boolean") 
*/ 
protected $sent; 


/** 
* @ORM\Column(type="boolean") 
*/ 
protected $spammed; 

/** 
* @ManyToMany(targetEntity="View") 
* @JoinTable(name="messages_views", 
*  joinColumns={@JoinColumn(name="message_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@JoinColumn(name="view_id", referencedColumnName="id", unique=true)} 
*  ) 
*/ 
protected $view; 



class View extends CollectionType 

{ 
public function __construct($user) 
{ 
    $this->user = $user; 
    $this->trashed = false; 
    $this->deleted = false; 
    $this->seen = false; 
} 


/** 
* @ORM\Column(type="boolean") 
*/ 
protected $trashed; 

/** 
* @ORM\Column(type="boolean") 
*/ 
protected $deleted; 

/** 
* @ORM\Column(type="boolean") 
*/ 
protected $seen; 

/** 
* @ManyToOne(targetEntity="User") 
* @JoinColumn(name="user_id", referencedColumnName="id") 
*/ 
protected $user; 
} 

$视图类的ArrayCollection()和一对多的关系。 我想选择字段“其中$ toUser =:我”,其中包含$ view其中$ view-> user =:me和$ view-> trashed = false“(如果有两个$视图的话/预期)选择首次发现)提前 感谢您的时间

编辑: 目前,我有这样的事情

$get = $this->getEntityManager() 
     ->createQuery(' 
      SELECT m 
      FROM MonoAdminBundle:Message m 
      WHERE m.userTo = :me AND m.sent = true 
      AND 
      ORDER BY m.date DESC 
     ') 
     ->setParameter('me', $me->getId())->getArrayResult(); 
    $ret = new \Doctrine\Common\Collections\ArrayCollection(); 
    foreach ($get as $message) { 
     if ($message->getSpammed() === false) { 
      foreach ($message->getView() as $view) { 
       if ($view->getUser() == $me) { 
        if ($view->getTrashed() === false) { 
         $ret->add($message); 
        } 
       } 
      } 
     } 

    } 

但正如我想使用分页程序是不是好主意。

回答

0

尝试使用queryBuilder。

$qb = $entityManager->getRepository(Message::class)->createQueryBuilder('m'); 
$qb->addWhere('m.toUser = :me') 
    ->innerJoin('m.view', v) 
    ->addWhere('v.user = :me') 
    ->addWhere('v.trashed = :isTrashed') 
    ->setParameter('me', $user) 
    ->setParameter('isTrashed', false); 

要获得DQL:

$qb->getQuery()->getDQL(); 

然后得到结果:

$qb->getQuery()->getResults(); 
+0

感谢您的帮助:) – npower