我有一个实体Post
,其中包含属性parent
,children
和published
。属性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
));
答案 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条件添加到每个查询中。