Doctrine - 根据列值从许多结果中获取行或行

时间:2012-07-12 14:05:56

标签: symfony doctrine-orm

我正在使用一对多关系的学说,其中每个用户实体都有许多帖子实体。所以我有一个像这样的学说查询

$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实体类完成吗?

3 个答案:

答案 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();
    }
}