2016-03-28 2 views
-1

После моего вопроса previous у меня возникла новая проблема. У меня есть 2 объекта - авторы и книги, у одного автора может быть много книг, но в 1 книге есть только 1 автор. Теперь книга также имеет дату создания. Я могу показать, сколько книг каждый автор, как это,Symfony2 Twig показать записи за последний месяц

Author Books 
Author1  5 
Author2  7 etc... 

, но наряду с этим в той же таблице мне нужно показать отдельно, как было добавлено много книг каждого автора в прошлом месяце, как это:

Author Books Added in last month 
Author1  5   2 
Author2  7   3 etc.. 

В моей БД я получаю все авторские объекты, которые сопоставляется с книгами, и это становится все книги для автора, как это:

<td>{{ author.books|length}}</td> 

Так что я думаю, что должна быть какая-то Twig datet ime, который будет показывать только книги, добавленные в прошлом месяце. Ive видел this вопрос и еще кое-что здесь о SO, но они в основном связаны с форматированием даты, а не с интервалами. Любые идеи приветствуются, спасибо.

EDIT 1 Код контроллера

<?php 
namespace AB\ProjectBundle\Controller; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Doctrine\Common\Collections\Criteria; 
use Symfony\Component\HttpFoundation\Response; 
use AB\ProjectBundle\Entity\Book; 

class AuthorController extends Controller 
{ 
public function indexAction() 
{ 
    $em = $this->getDoctrine()->getManager(); 
$userid = $this->container->get('security.context')->getToken()->getUser()->getId();  
$entity = $em->getRepository('ABProjectBundle:Authors')->findBy(array('userid'=>$userid)); 

$books = $entity[0]->getBooks(); 

$criteria = Criteria::create() 
     ->where(Criteria::expr()->gte("datecreation", "2016-03-15")) 
     ->orderBy(array("datecreation" => Criteria::ASC)) 
     ->setFirstResult(0) 
     ->setMaxResults(20) 
     ; 

$filtered = $books->matching($criteria); 
$twig = 'ABProjectBundle::index.html.twig'; 
$paramTwig = array(
     'authors'  => $entity, 
     'filtered'  => $filtered, 
    ); 

    return $this->render($twig, $paramTwig); 
} 

ответ

2

Существует нет ничего подобного в веточке. Вам необходимо отфильтровать свою коллекцию на QueryBuilder/DQL (добавьте необходимый where) или с помощью Doctrine Collection Filtering.

пример:

use Doctrine\Common\Collections\Criteria; 

// get $author 

$bookCollection = $author->getBooks(); 

$criteria = Criteria::create() 
    ->where(Criteria::expr()->gte("added_date", "2015-02-17")) 
    ->orderBy(array("added_date" => Criteria::ASC)) 
    ->setFirstResult(0) 
    ->setMaxResults(20) 
; 

$filteredAuthorBooks = $bookCollection->matching($criteria); 

Тогда передайте это вашему мнению. Старайтесь не создавать сложную логику или фильтрацию в ваших шаблонах. Лучшим в вашем случае будет получение из базы данных только необходимых результатов с join в запросе Author.

+0

Im передавая его в виде с длиной, но получаю только нули в представлении. Если я удаляю длину, я получаю Doctrine \ Common \ Collections \ ArrayCollection @ 0000000023bf3ae5000000006ee44d9f для каждого автора. Есть идеи, что это может быть? – Jack

+0

Теперь он говорит об ошибке FatalErrorException в строке DateTimeType.php 53: Ошибка: вызов в формате функции участника() в строке. Тип моего столбца added_date в DB - Timestamp, изменил его на DateTime, но это не помогло. – Jack

+0

Изменен тип столбца в файле orm.yml для строки, и он решил проблему, но я не знаю, правильно ли это сделать. Теперь он получает правильное количество книг, созданных первым автором за последний месяц, и показывает этот же номер для каждого оставшегося автора в таблице (( – Jack

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