2015-07-16 3 views
2

У меня есть разработчик субъект, который имеет поле роль, $ unsubscribeDate, $ теги и мне нужно найти разработчика, который: - есть роль фрилансер, - unsubscribeDate < NowDate - тег не =: черный список, отписался (inDB a: 2: {i: 0; s: 12: «unsubscribed»; i: 1; s: 9: «черный список»;}) или тег имеют = a: 0: {}Как найти объект в doctrine2

Как я это я не знаю, помогите пожалуйста эту сущность

/** 
* Developers 
* 
* @ORM\Table(name="developers") 
* @ORM\Entity(repositoryClass="Artel\ProfileBundle\Entity\DeveloperRepository") 
*/ 
class Developer extends CustomUser 
{ 
    /** 
* @var integer 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 
    /** 
* @var \DateTime 
* @ORM\Column(name="unsubscribe_date", type="date") 
*/ 
protected $unsubscribeDate; 

/** 
* @var string 
* 
* @ORM\Column(name="tags", type="array", nullable=true) 
*/ 
private $tags = array(); 
    /** 
* @var string 
* 
* @ORM\Column(name="role", type="string", length=25, nullable=true) 
*/ 
protected $roles; 

пример жид, что найти разработчика, который имеет $ роль и unsubscribeDate < nowTime и у кого нет: 2: {i: 0; s: 12: «unsubscribed»; i: 1; s: 9: «черный список»;} но если у разработчика есть: 3: {i: 0; s : 12: «unsubscribed»; i: 1; s: 9: «blacklist»; i: 2; s: 7: «company»;} Этот разработчик добавляет в список - неправильно, как я это проверю? И я не знаю, почему разработчик, который имеет поля метки = NULL не добавить в этот список ??:

public function getWhoNotSendEmail($role, $tags) 
{ 
    $date = new \DateTime; 

    $qb = $this->getEntityManager()->createQueryBuilder('d'); 

    $qb 
     ->select('d') 
     ->from('ArtelProfileBundle:Developer', 'd') 
     ->where('d.roles = :role') 
     ->andWhere('d.unsubscribeDate <= :departureDate') 
     ->setParameter('departureDate', $date) 
     ->setParameter('role', $role) 

     ->getQuery(); 

    $query = $qb->getQuery(); 
    $results = $query->getResult(); 

    $arrayResults = array(); 
    foreach ($results as $result) { 

     if (is_array($result->getTags())) { 
      if (count(array_diff($result->getTags(), $tags)) > 0) { 
       $arrayResults[] = $result; 
      } 
     } 
    } 

    return $arrayResults; 
} 

ответ

1

Вы не можете сделать это, вы могли бы это сделать, если теги были только один, если это массив, вы не можете.

Решение может быть делающего запрос, получая все значения из тегов, а затем, если array_diff> 0 означает, что вы держите этот проявитель

public function getWhoSendEmail($role, $bl) 
{ 
    $date = new \DateTime; 

    $qb = $this->getEntityManager()->createQueryBuilder('d'); 

    $qb 
     ->select('d') 
     ->from('ArtelProfileBundle:Developer', 'd') 
     ->where('d.roles = :role') 
     ->andWhere('d.unsubscribeDate <= :departureDate') 
     ->setParameter('role', $role) 
     ->setParameter('departureDate', $date) 
     ->getQuery() 
    ; 

    $query = $qb->getQuery(); 
    $results = $query->getResult(); 

    $arrayResults = array(); 
    foreach ($results as $result) { 

     $arrayTags = explode(",", $result->getTags()); 
     if (count(array_diff($arrayTags, $b1)) > 0) { 
      $arrayResults[] = $result; 
     } 
    } 

    return $arrayResults; 
} 

Если бы это было только один тег для каждой строки вы можете сделать это с

->andWhere('d.tag NOT IN (:tags)') 

Но это не случай ...

+0

$ роли, как это это varible в действии $ бл = [черный список, отписались] перейти к тху чат –

+0

Проверьте это сейчас, чат является оп когда есть много комментариев, а не до –

+0

inDB Developer имеют: 2: {i: 0; s: 12: «unsubscribed»; i: 1; s: 9: «черный список»;} и в моих действиях написать право $ bl? $ bl = ['черный список', 'unsubscribed']; $ dev_tag = $ em-> getRepository ('ArtelProfileBundle: Developer') -> getWhoSendEmail ($ role, $ bl); –

Смежные вопросы