0

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

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

4

3 回答 3

5

Doctrine 的集合是可过滤的。因此,假设您的 Post 实体存储在 上User::$posts,请在您的用户实体中执行此操作。

public function getPostsBySlug( $slug )
{
  return $this->posts->filter( function( Post $post ) use ( $slug )
  {
    return $post->getSlug() == $slug;
  } );
}

然后你可以做

$posts = $user->getPostsBySlug( 'my_slug' );
于 2012-07-12T15:05:29.530 回答
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();
    }
}
于 2012-07-12T14:34:17.187 回答
0

怎么办

$slug = 'my_slug';
array_filter($user->getPosts()->all(), function ($post) use ($slug) {
    return $post->getSlug() == $slug;
})
于 2012-07-12T14:26:46.767 回答