我正在使用一对多关系的学说,其中每个用户实体都有许多帖子实体。所以我有一个像这样的学说查询
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery(
'SELECT u, p FROM MYUserBundle:User u
JOIN u.post p'
);
然后我就可以获得像这样的用户帖子
foreach($query->getResult() as $user){
//a bunch of posts related to this user
$posts = $user->getPosts();
}
为方便起见,我想创建一个API,允许我根据列值从这个$ posts对象中获取特定帖子或帖子,而不使用更多查询。所以例如我有一个名为post_slug的列,所以我希望能够说
$posts = $user->getPosts();
$post = $posts->findBySlug('my_slug');
//or something along those lines...
这可以通过$ posts对象或Post实体类完成吗?
答案 0 :(得分:5)
Doctrine的藏品是可过滤的。因此,假设您的帖子实体存储在User::$posts
上,请在您的用户实体中执行此操作。
public function getPostsBySlug( $slug )
{
return $this->posts->filter( function( Post $post ) use ( $slug )
{
return $post->getSlug() == $slug;
} );
}
然后你可以做
$posts = $user->getPostsBySlug( 'my_slug' );
答案 1 :(得分:0)
做什么
$slug = 'my_slug';
array_filter($user->getPosts()->all(), function ($post) use ($slug) {
return $post->getSlug() == $slug;
})
答案 2 :(得分:0)
您可以将此类功能移至Repository类(扩展EntityRepository)。
例如:
namespace Acme\ThingBundle\Repository;
use Doctrine\ORM\EntityRepository;
class PostRepository extends EntityRepository
{
public function getBySlug($slug)
{
/// your custom query here
return $q->getQuery()->getResult();
}
}