2015-01-29 2 views
0

У меня есть два объекта, сообщение и тому подобное, сообщение имеет OneToMany.Атрибут подсчета OneToMany

Сообщение Класс

/** 
* Post 
* 
* @ORM\Table() 
    * @ORM\Entity(repositoryClass="Mag\MyBundle\Entity\PostRepository") 
    */ 
    class Post { 
//... 

/** 
*@ORM\OneToMany(targetEntity="Mag\MyBundle\Entity\LikePost",mappedBy="post") 
* 
*/ 
private $likes; 
private $countLikes; 

//... 
} 

Как класс

/** 
* LikePost 
* 
* @ORM\Table() 
* @ORM\Entity 
*/ 
class LikePost 
{ 
//... 

    /** 
    * @ORM\ManyToOne(targetEntity="Mag\MyBundle\Entity\Post",cascade={"persist"},inversedBy="likes") 
    * @ORM\JoinColumn(nullable=false) 
    */ 
    private $post ; 
    //... 
} 

Я хочу, чтобы получить кол-подобных в сообщениях. я пытался в PostRepository

$qb = $this->createQueryBuilder('p'); 
     $query = $qb 
       ->addSelect($qb->expr()->count('l')) 
       ->leftJoin('p.likes', 'l') 
       ->groupBy('p.id') 
       ->orderBy('p.datePost', 'DESC') 
       ->setFirstResult(($page - 1) * $count) 
       ->setMaxResults($count) 
       ->getQuery(); 

но это дает массив запроса два выбора. Как я могу сохранить результат «-> addSelect ($ qb-> expr() -> count ('l'))" в атрибуте $ countLikes в post-объекте?

ответ

0

Возможно, вы можете написать пользовательский драйвер для гидратации, который интерпретирует результаты, но я еще ничего не сделал.

Можете ли вы сделать это вручную?

$query = $qb 
    ->addSelect($qb->expr()->count('l')) 
    ->leftJoin('p.likes', 'l') 
    ->groupBy('p.id') 
    ->orderBy('p.datePost', 'DESC') 
    ->setFirstResult(($page - 1) * $count) 
    ->setMaxResults($count) 
    ->getQuery(); 

$result = $query->getResult(); 
$actualResult = array(); 

foreach ($result as $r){ 
    // assuming that object is at position `0` and like count at position `1` 
    $r[0]->setCountLikes(intval($r[1])); 

    $actualResult[] = $r[0]; 
} 

return $actualResult; 
+0

Это работает, но это не более жадный, если есть огромное количество запросов? – houssine

+0

Я думаю, вы должны быть в порядке, так как 'COUNT' рассчитывается на стороне« СУБД », поэтому никаких дополнительных запросов не будет. Кроме того, я предполагаю, что '$ count' относительно невелик, может быть, 50-100 макс? Это число итераций, но 'PHP' должен обрабатывать это довольно быстро. –

+0

Другой вопрос, пожалуйста, как я могу сделать счет с предложением where? и спасибо большое – houssine

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