2017-07-02 52 views
0

我是新来的Symfony Doctrine并想重写我的旧应用程序。对于一个视图,我需要从一个表中的所有东西,我会正常使用find()。但我也必须通过连接访问anoter值。Symfony2:加入find()的结果

是否有可能将查询生成器与find()方法结合起来?

这是我目前的操作:

$em = $this->getDoctrine()->getManager();   
$rep = $em->getRepository('PaulInkBundle:Artist'); 
$artist = $rep->find($id); 
$styles = $rep->getStyles($id); 
return $this->render('PaulInkBundle:Artist:artist.html.twig', array(
    'artist' => $artist, 
    'styles' => $styles 
)); 

的getStyles()方法获取链接到艺术家的风格:

public function getStyles($id) 
    { 
     return $this->getEntityManager() 
      ->createQuery(
       'SELECT s.name 
       FROM PaulInkBundle:Style s 
       WHERE s.id IN (
         SELECT st.style 
         FROM PaulInkBundle:ArtistStyle st 
         WHERE st.artist = :id) ' 
      )->setParameter('id',$id) 
      ->getResult(); 
    } 

是否可以在一个功能,因此不必做此艺术家tat中的风格被传递给视图?

编辑:

的关联:

艺术家(NR) - > ArtistStyle(artist.nr/style.nr)< - 风格(NR,名)

因此,我想得到所有样式,名称以特异性艺术家ID

class Artist 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255) 
    */ 
    private $name; 
} 

class ArtistStyle 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="artist", type="integer") 
    */ 
    private $artist; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="style", type="integer") 
    */ 
    private $style; 
} 

class Style 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="name", type="string", length=255, unique=true) 
    */ 
    private $name; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="descr", type="text") 
    */ 
    private $descr; 
} 
+0

你能证明你的实体协会(PaulInkBundle:样式,PaulInkBundle: ArtistStyle)? –

+0

@PeterPopelyskho @PeterPopelyskho添加(很差,bc我在火车上w /电话) – TechTreeDev

回答

2

我假设你有以下:

多对多协会测绘与 艺术家风格

因此,而不是写这个:

$artist = $rep->find($id); 
$styles = $rep->getStyles($id); 

您可以创建一个方法是这样的:

/** 
* @var int $id 
* @return Artist|null 
*/ 
public function getArtistWithStyles($id) 
{ 
    return $this->createQueryBuilder('a') 
     ->join('a.styles', 's') 
     ->where('a.id = :id') 
     ->setParameter('id', $id) 
     ->getQuery() 
     ->getOneOrNullResult(); 
} 

现在你可以做下一个:

内部控制器:

$artist = $repository->getArtistWithStyles($id); 

return $this->render('PaulInkBundle:Artist:artist.html.twig', array(
    'artist' => $artist, 
)); 

在你看来,你可以访问简单的方法你的风格:

{% for style in profile.getStyles() %} 
    {{ style.getName() }} 
{% endfor %} 

另一种解决方案可能是下一个:

您可以添加Doctrine extensions bundle并使用GROUP_CONCAT功能。将它添加到你的教义配置。

dql: 
    string_functions: 
     group_concat: DoctrineExtensions\Query\Mysql\GroupConcat 

,改变你的getArtistWithStyles方法是:

public function getArtistWithStyles($id) 
{ 
    return $this->createQueryBuilder('a') 
     ->select('a, GROUP_CONCAT(s.name SEPARATOR \'; \')') 
     ->join('a.styles', 's') 
     ->where('a.id = :id') 
     ->setParameter('id', $id) 
     ->getQuery() 
     ->getOneOrNullResult(); 
} 

你会得到这样的结果:

[ 
    'artist' => {Object}, 
    'styles' => 'style1; style2; style3' 
] 
+0

非常感谢:) – TechTreeDev

+0

WHERE a.id':错误:类Paul \ InkBundle \ Entity \ Artist没有关联命名风格 任何想法? – TechTreeDev

+0

@TechTreeDev显示你的'实体'代码,你可能需要添加$ style作为很多关系 –