我有一个理解问题。
我有2个映射的实体
class news
{
public function __construct()
{
$this->newsgroups = new ArrayCollection();
}
/**
* @ORM\ManyToMany(targetEntity="Unite\NewsBundle\Entity\newsgroup", inversedBy="news")
* @ORM\JoinTable(name="news_to_newsgroup")
**/
protected $newsgroups;
....
}
和
class newsgroup
{
public function __construct()
{
parent::__construct();
$this->news = new ArrayCollection();
}
/**
* @ORM\ManyToMany(targetEntity="Unite\NewsBundle\Entity\news", mappedBy="newsgroups", cascade={"detach"})
* @ORM\OrderBy({"undate" = "DESC"})
**/
protected $news;
....
}
我的问题: 我怎样才能得到所有有效的新闻以及日期x和y之间的新闻组' x' 当我使用我的新闻组对象(函数getNews())
时/**
* Gets the groups granted to the user.
*
* @return Collection
*/
public function getNews()
{
return $this->news ?: $this->news = new ArrayCollection();
}
是否真的有必要用foreach查看每条新闻并检查我的条件是否属实?
非常感谢我的朋友们的帮助:)
答案 0 :(得分:2)
我建议您根据自己的条件获取新闻。查询将像这样
$query = $repository->createQueryBuilder('n')
->innerJoin('n.newsgoup', 'ng')
->where('ng.id > :newsGroupId')
->where('ng.undate BETWEEN :monday AND :sunday')
->setParameter('newsGroupId', '1')
->setParameter('monday', '2016-01-02')
->setParameter('sunday', '2016-02-17')
->getQuery();
$news = $query->getResult();
答案 1 :(得分:1)
您可以使用Doctrine\Common\Collections\Criteria类来过滤集合。
您可以在实体中创建额外的方法:
public function getFilteredNews()
{
$criteria = Criteria::create()
->where('isActive', true)
->andWhere(Criteria::expr()->between(
'createdAt',
'2016-02-20',
'2016-02-25'
));
return $this->getNews()->matching($criteria);
}
或者,您可以使用ArrayCollection
中的filter方法或为您的实体创建存储库,并使用QueryBuilder获取数据(如Anna所建议的那样)。