我定义了一个基本的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的事件监听器仅适用于数据操作而非选择。
答案 0 :(得分:1)
我认为这是不可能的,更简单的解决方案可以是为实体添加自定义存储库
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();
}
}
或者您可以覆盖存储库的默认方法并将您添加到条件的位置。
文档: http://docs.doctrine-project.org/en/2.0.x/reference/working-with-objects.html#custom-repositories
答案 1 :(得分:1)
我最近遇到过这样的任务并且像这样解决了(但我不认为这是一种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();
}
}
答案 2 :(得分:0)
您可以利用特征:
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;
}