从 self-referencing 实体中检索 children 并满足 Doctrine 2 中的特定条件
Retrieve children from self-referencing entity with certain condition in Doctrine 2
我有一个实体 Post
,它具有 parent
、children
和 published
等属性。 属性 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 条件添加到每个查询中。
我有一个实体 Post
,它具有 parent
、children
和 published
等属性。 属性 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 条件添加到每个查询中。