Symfony2:加入find()结果

时间:2017-07-02 17:35:41

标签: php symfony doctrine-orm

我是Symfony的Doctrine新手,想要改写我的旧应用程序。对于一个视图,我需要从一个表中获取所有内容,我会正常使用find()。但我还必须通过join访问anoter值。

是否可以将Query Builder与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();
    }

是否可以在一个函数中执行此操作,从而将艺术家的样式传递给视图?

编辑:

协会:

艺术家(nr) - > ArtistStyle(artist.nr/style.nr)< - Style(nr,name)

因此,我希望获得具有特定艺术家ID的所有Style-names

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;
}

1 个答案:

答案 0 :(得分:2)

我假设您有以下内容:

MANY TO MANY 关联映射 艺术家样式

所以不要写这个:

$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'
]