[英]Can I specify default conditions in Doctrine queries?
我定义了基本的Doctrine页面实体。
namespace Example\Entity;
/**
* @ORM\Entity
*/
class Page
{
/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=100)
*/
private $title;
/**
* @ORM\Column(type="string", length=25)
*/
private $status;
}
$ status属性将是“已发布”,“草稿”,“已删除”,“待处理”之一。
我想知道是否有可能对该实体上的所有查询自动包含条件WHERE status = 'published'
除非查询另有指定。
该实体上90%的查询将针对已发布的帖子,对于开发人员而言,无意中抓住所有草稿,待处理和已删除的帖子而又没有意识到它们会限制结果,这将太容易了。
据我所知,Doctrine的事件侦听器仅适用于数据操作而不适用于选择。
我认为这是不可能的,更简单的解决方案是为实体添加自定义存储库
namespace Example\Entity;
/**
* @ORM\Entity(repositoryClass="Example\Entity\PageRepository")
*/
class Page
然后,您可以创建新方法,例如:
class PageRepository extends EntityRepository
{
public function getAllPage()
{
return $this->_em->createQuery('SELECT p FROM Example\Entity\Page p WHERE u.status = "published"')->getResult();
}
}
或者,您可以覆盖存储库的默认方法,并将您添加到where条件。
文档: http : //docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html#custom-repositories
我最近遇到了这样的任务,并像这样解决了它(但我不认为这是一种symfony的方式:)):创建了一个扩展EntityREpository的类:
class MainPageRepository extends EntityRepository
{
protected function createQuery()
{
$queryBuilder = $this->getEntityManager()->createQueryBuilder();
$query = $queryBuilder
->select(array('p'))
->from('STMainSiteWebBundle:Page', 'p')
->where('p.deleted = :deleted')
->setParameter('deleted', false);
return $query;
}
}
并在需要创建查询时对其进行扩展:
class PageRepository extends MainPageRepository
{
public function fetchAllByType($type, $offset = 0, $limit = 15)
{
$query = $this->createQuery();
$query
->andWhere('p.pageType = :pageType')
->orderBy('p.id', 'DESC')
->setParameter('pageType', $type)
->getQuery()
;
$query->setFirstResult($offset);
$query->setMaxResults($limit);
return $query->getResult();
}
}
您可以利用特征:
trait WithStatus
{
public function createQueryBuilder($alias, $indexBy = NULL)
{
$qb = parent::createQueryBuilder($alias, $indexBy);
$qb->where("$alias.status = :status");
$qb->setParameter('status', 'published');
return $qb;
}
}
class PageRepository extends EntityRepository
{
use WithStatus;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.