我是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;
}
答案 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'
]