2015-05-20 2 views
0

Задача: ¿Как я могу получить все приложения с заданным статусом?Поиск событий в Doctrine - ManyToMany

Гипотеза:

  • статуса приложения является его последним событие.
  • События имеют инкрементные идентификаторы.

Событие:

<?php 

namespace DnD\RaHApiBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use JMS\Serializer\Annotation\Groups; 
use Symfony\Component\Validator\Constraints\DateTime; 

/** 
* Event 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class Event 
{ 

    public function __construct($name = null, $type = null) { 
    if (isset($name)) $this->name = $name; 
    if (isset($type)) $this->type = $type; 
    $this->eventDate = date_create(date("Y-m-d\TH:i:sO")); 
    } 

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

    /** 
    * @var string 
    * 
    * @ORM\Column(name="type", type="string", length=255, nullable=true) 
    * @Groups({"application_info"}) 
    */ 
    private $type; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    * @Groups({"application_info"}) 
    */ 
    private $name; 


    /** 
    * @var date of event. 
    * 
    * @ORM\Column(name="event_date", type="datetime") 
    * @Groups({"application_info"}) 
    */ 
    private $eventDate; 

    ... 
} 

Применение:

<?php 

namespace DnD\RaHApiBundle\Entity; 

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 
use JMS\Serializer\Annotation\Groups; 
use Symfony\Component\Validator\Constraints\DateTime; 

/** 
* Solicitud de registro. 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="DnD\RaHApiBundle\Repository\ApplicationRepository") 
*/ 
class Application 
{ 

    public function __construct() 
    { 
    $pending = new Event("PENDING", "APPLICATION"); 

    $this->status = new ArrayCollection($pending); 
    } 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @Groups({"application_info"}) 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    * @Groups({"application_info"}) 
    */ 
    private $name; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="dni", type="string", length=255) 
    * @Groups({"application_info"}) 
    */ 
    private $dni; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="email", type="string", length=255) 
    * @Groups({"application_info"}) 
    */ 
    private $email; 

    /** 
    * @var string 
    * 
    * @ORM\ManyToMany(targetEntity="DnD\RaHApiBundle\Entity\Event", cascade={"persist"}) 
    * @ORM\JoinTable(
    *  name="applications_events", 
    *  joinColumns={@ORM\JoinColumn(name="application_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@ORM\JoinColumn(name="event_id", referencedColumnName="id", unique=true)} 
    *) 
    * @Groups({"application_info"}) 
    */ 
    private $status; 
} 

¿Есть ли способ, чтобы получить приложение с данным "последним статусом"?

ответ

0

Вы можете сделать собственный запрос в своем репозитории Application.

doctrine 2 QueryBuilder С вашего запроса может выглядеть следующим образом:

public function getApplicationsByStatusId($id) 
{ 
    $applications = $this->createQueryBuilder('a') 
     ->innerJoin('a.status', 's') 
     ->where('s = :status_id') 
     ->setParameter('status_id', $id) 
     ->getQuery() 
     ->getResult(); 

    return $applications; 
} 

Поскольку это ManyToMany ассоциация ваш результат может быть во множественном числе.

+0

Где этот статус LAST? – danielrvt

+0

@ danielrvt Вы говорите * последний статус *, поэтому я предполагаю, что вы даете 'id'. В противном случае вы должны четко указать, что вы имеете в виду с * последним статусом *. Какая польза? Если дано какое-то другое свойство статуса, вы просто меняете предложение where на '-> где ('s.property =: value')'. – Wilt