从 self-referencing 实体中检索 children 并满足 Doctrine 2 中的特定条件

Retrieve children from self-referencing entity with certain condition in Doctrine 2

我有一个实体 Post,它具有 parentchildrenpublished 等属性。 属性 parent 是多对一关系,children 是一对多关系。 published 属性 是布尔值。

我想获得一个带有特定 ID 的 Post,带有已发布的 children,因此将 published 设置为 true。

我想用 QueryBuilder 或 DQL 来实现。我尝试了以下方法,但它仍然返回 not-published children。

    $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
    ));

原则SQL 过滤器是你的朋友。

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

示例: 在您的项目中放置一个 class(例如在过滤器中)

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

重要的是要知道,如果你需要 select 过滤的东西(例如在后端),你需要禁用过滤器 $this->getDoctrine()->getManager()->getFilters()->disable('published');

编辑:稍微解释一下它的作用 如果您的架构实际上具有 "published" 字段,它会将(在您的示例中) p.published = true 条件添加到每个查询中。