我可以在Doctrine查询中指定默认条件吗?

问题描述 投票:1回答:3

我定义了一个基本的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的事件监听器仅适用于数据操作而非选择。

php symfony doctrine
3个回答
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
投票

我最近遇到过这样的任务并且像这样解决了它(但我不认为这是一种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();
    }
}

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.