Symfony使用statement(where子句)获取映射实体

时间:2016-02-25 06:44:11

标签: php symfony doctrine

我有一个理解问题。

我有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查看每条新闻并检查我的条件是否属实?

非常感谢我的朋友们的帮助:)

2 个答案:

答案 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所建议的那样)。