Doctrine - 如何检查集合是否包含实体
Doctrine - how to check if a collection contains an entity
我有两个实体 User
和 Article
具有多对多关系,因为 Article
可以有很多作者。
class User
{
/** @var string */
public $name;
/** @var Collection<Article> */
public $articles;
}
class Article
{
/** @var string */
public $title;
/** @var Collection<User> */
public $authors;
}
如何使用 DQL 查找具有指定(合)作者的所有文章?
使用MEMBER OF
表达式。
您的 DQL 查询可能会喜欢
SELECT art FROM Article art WHERE :user MEMBER OF art.authors
或使用查询生成器
$queryBuilder = $repository->createQueryBuilder("art");
$queryBuilder->where(":user MEMBER OF art.authors");
或者您可以加入和过滤集合
SELECT art FROM Article art JOIN art.authors aut WHERE aut = :user
或
$queryBuilder = $repository->createQueryBuilder("art");
$queryBuilder->join("art.authors", "aut");
$queryBuilder->where("aut = :user");
使用查询生成器
总结
$qb->expr()->isMemberOf(':user', 'a.authors')
解决方案
src/Repository/ArticleRepository.php
/**
* @param User $author
* @return Article[] List of articles filtered by $author
*/
public function findByAuthor(User $author): array
{
$qb = $this->createQueryBuilder('a');
$qb->setParameter('user', $author);
$qb->where($qb->expr()->isMemberOf(':user', 'a.authors'));
return $qb->getQuery()->getResult();
}
使用示例
src/Controller/ArticleController.php
/**
* @Route("/article/{id<\d+>}", name="show-articles-by-author")
* @param ArticleRepository $articleRepository
* @param User $author
*/
public function showArticlesFromAuthor(ArticleRepository $articleRepository, User $author)
{
$articles = $articleRepository->findByAuthor($author);
return $this->render('articles.html.twig', [
'articles' => $articles,
'author' => $author->getName()
]);
}
templates/articles.html.twig
<h1>Articles from {{ author }}</h1>
<li>
{% for article in articles %}
<ul>
{{ article.title }}
</ul>
{% endfor %}
</li>
我有两个实体 User
和 Article
具有多对多关系,因为 Article
可以有很多作者。
class User
{
/** @var string */
public $name;
/** @var Collection<Article> */
public $articles;
}
class Article
{
/** @var string */
public $title;
/** @var Collection<User> */
public $authors;
}
如何使用 DQL 查找具有指定(合)作者的所有文章?
使用MEMBER OF
表达式。
您的 DQL 查询可能会喜欢
SELECT art FROM Article art WHERE :user MEMBER OF art.authors
或使用查询生成器
$queryBuilder = $repository->createQueryBuilder("art");
$queryBuilder->where(":user MEMBER OF art.authors");
或者您可以加入和过滤集合
SELECT art FROM Article art JOIN art.authors aut WHERE aut = :user
或
$queryBuilder = $repository->createQueryBuilder("art");
$queryBuilder->join("art.authors", "aut");
$queryBuilder->where("aut = :user");
使用查询生成器
总结
$qb->expr()->isMemberOf(':user', 'a.authors')
解决方案
src/Repository/ArticleRepository.php
/**
* @param User $author
* @return Article[] List of articles filtered by $author
*/
public function findByAuthor(User $author): array
{
$qb = $this->createQueryBuilder('a');
$qb->setParameter('user', $author);
$qb->where($qb->expr()->isMemberOf(':user', 'a.authors'));
return $qb->getQuery()->getResult();
}
使用示例
src/Controller/ArticleController.php
/**
* @Route("/article/{id<\d+>}", name="show-articles-by-author")
* @param ArticleRepository $articleRepository
* @param User $author
*/
public function showArticlesFromAuthor(ArticleRepository $articleRepository, User $author)
{
$articles = $articleRepository->findByAuthor($author);
return $this->render('articles.html.twig', [
'articles' => $articles,
'author' => $author->getName()
]);
}
templates/articles.html.twig
<h1>Articles from {{ author }}</h1>
<li>
{% for article in articles %}
<ul>
{{ article.title }}
</ul>
{% endfor %}
</li>