2012-07-12 12 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