2012-07-12 27 views
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... 

这是东西,可以用$职位对象或Post实体类做些什么呢?

回答

5

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

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

然后,你可以做

$posts = $user->getPostsBySlug('my_slug'); 
+0

这太棒了。感谢您的解决方案。 – Mike 2012-07-12 17:57:40

0

什么做

$slug = 'my_slug'; 
array_filter($user->getPosts()->all(), function ($post) use ($slug) { 
    return $post->getSlug() == $slug; 
}) 
+0

这给了我致命错误:调用未定义的方法学说\ ORM \ PersistentCollection ::所有() – Mike 2012-07-12 14:27:58

0

可以这种功能移动到(延伸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(); 
    } 
} 
+0

这里的一些信息:http://symfony.com /doc/current/book/doctrine.html#custom-repository-classes – Pappa 2012-07-12 14:36:25

+0

他只想做一个查询,然后用php搜索获取的数据。 – AdrienBrault 2012-07-12 14:37:00

+0

是的,这不是我想要做的。我需要运行一个查询,然后根据列值缩小范围。这也可以用于其他关系。 – Mike 2012-07-12 14:39:18