2017-01-31 9 views
1

У меня есть два классаSymfony 2 получить Учение в Entity

class Topic 
    { 
     protected $id; 
     //.... 
    } 

и

class Post 
{ 
    protected $topic_id; 
    //... 
} 

, и я хотел бы добавить метод getPostCount() в классе Тема. В других структур я использовать что-то вроде этого:

public function getPostCount() 
    {   
      $count = Post::find() 
       ->where(['topic_id' => $this->id]) 
       ->count(); 

     return $count; 
    } 

но в Symfony2 я не знаю, как это сделать.

ответ

3

Вы можете создать repository class с помощью этого метода. Добавьте имя хранилища класса для определения отображения вашего предприятия, например:

/** 
* @ORM\Entity(repositoryClass="AppBundle\Repository\PostRepository") 
*/ 
class Post 
{ 
    protected $topic_id; 
    //... 
} 

И в вашем хранилище класса:

public function getPostCount($id) 
{   
    $query = $this->createQueryBuilder('p') 
     ->select('count(p.topic_id)') 
     ->where('p.topic_id = :id') 
     ->setParameter('id', $id) 
     ->getQuery()->getSingleScalarResult(); 
    return $query; 
} 
+0

привет, Спасибо за ваш ответ. Как я могу использовать ваше решение, чтобы показать postCount в представлении? Что-то вроде post.getPostCount (topic.id)? –

+0

Если вам нужен только один счетчик, передайте переменную от контроллера к веточке. С другой стороны, вы можете создать фильтр Twig, это небольшой пример http://ourcodeworld.com/articles/read/161/how-to-execute-a-doctrine-query-using-twig-on-a-template -in-symfony-2-and-3 – panche14

+0

Благодарим вас за ответ. –

2
//Topic.php 

public function getPostsCount() 
{ 
    return $this->getPosts()->count(); 
} 

Если сконфигурированы аннотации или yml должным образом, вы хорошо с этим

3

В дополнение к @DonCallisto ответить

//Topic.php 
public function getPostsCount() 
{ 
    return $this->getPosts()->count(); 
} 

Это использование доктрины lazyloading: это можно сделать, потому что вы уже определили связь между сущностью.

Это не было бы хорошей практикой для выполнения запроса внутри объекта, для этого вам следует использовать Repository.

+1

Во-первых, вы явно не делаете запрос: это доктрина, которая делает это для вас и отлично. Во-вторых: вы можете аннотировать поле, которое нужно увлажнять каждый раз, когда объект загружается (но я уверен, что вы не будете в этом случае, поскольку, возможно, postsCount не требуется каждый раз). Только «плохая практика» здесь находится в возможностях исполнения. – DonCallisto

+0

@DonCallisto Часть запроса относится к примеру автора. его метод 'getPostCount()' находится внутри объекта (он использует '$ this-> id'). У меня нет проблем с ответом – goto

+0

Я просто что-то объяснил, никаких проблем с вашим ответом вообще! :) Приветствия – DonCallisto

2

В сообщении репозитория:

public function getPostCount($id) { 
    $qb = $this->getEntityManager()->createQueryBuilder();  
    $qb->select('count(p.topic_id)'); 
    $qb->from('AppBundle:Post', 't') 
      ->where('p.topic_id = :id') 
      ->setParameter('id', $id); 
    $count = $qb->getQuery()->getSingleScalarResult(); 
    return $count; 
}