在Doctrine 2中以特定条件从自引用实体中检索子项

时间:2016-06-02 07:56:04

标签: symfony doctrine-orm dql

我有一个实体Post,其中包含属性parentchildrenpublished。属性parent是manyToOne关系,children是与自身的oneToMany关系。 published属性是布尔值。

我希望获得具有特定ID的Post以及已发布的子项,因此published设置为true。

我想用QueryBuilder或DQL实现这一点。我尝试了以下内容,但它仍然返回了未发布的孩子。

    $dql = $this->getEntityManager()->createQuery('
        SELECT
            p
        FROM
            SomeBundle\Entity\Post p
        LEFT JOIN
            p.children pc WITH pc.published = :published
        WHERE
            p.id = :id
    ');

    $dql->setParameters(array(
        'id' => $id,
        'published' => true
    ));

1 个答案:

答案 0 :(得分:2)

Doctrine SQL Filters是你的朋友。

http://doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/reference/filters.html http://symfony.com/doc/current/reference/configuration/doctrine.html

实施例: 在项目中放置一个类(例如在过滤器中)

use Doctrine\ORM\Mapping\ClassMetadata;
use Doctrine\ORM\Query\Filter\SQLFilter;

class PublishedFilter extends SQLFilter
{

/**
 * @param ClassMetadata $targetEntity
 * @param string        $targetTableAlias
 *
 * @return string
 */
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
    if (!array_search('published', $targetEntity->getFieldNames())) {
        return '';
    }

    return $targetTableAlias.'.published = true';

}
}

现在您只需在学说配置中添加该过滤器(请参阅http://symfony.com/doc/current/reference/configuration/doctrine.html)。 Tadaaaa.wav

重要的是要知道,如果您需要选择已过滤的内容(例如在后端),则需要禁用过滤器 $这 - > getDoctrine() - > getManager() - > getFilters() - >禁止( '发布');

编辑:解释它的作用 如果您的模式实际上具有“已发布”字段,它会将(在您的示例中)p.published = true条件添加到每个查询中。