我试图与Doctrine和symfony达成许多关系。 我是Doctrine和Symfony的新人。我来自Zend框架。
我创建了3个表格: Post,PostCategory和联结表PostToCategory,如下所示。
我的目标是进行内部联接,并为每个帖子获取其类别。 这是我到目前为止所做的:
// CMS / GBundle /实体/ PostContent
class PostContent
{
/**
* @ORM\ManyToMany(targetEntity="CMS\GBundle\Entity\PostCategory", inversedBy="posts")
* @ORM\JoinTable(name="post_to_category")
*/
protected $categories;
public function __construct()
{
$this->categories = new ArrayCollection();
}
// CMS / GBundle /实体/ PostCategory
class PostCategory
{
/**
* @ORM\ManyToMany(targetEntity="CMS\GBundle\Entity\PostContent", mappedBy="categories")
*/
protected $posts;
public function __construct()
{
$this->posts = new ArrayCollection();
}
我想现在创建一个函数,返回我加入的数据Post-> PostCategories。
我应该在哪里创建功能?在PostToCategory存储库中?或者别的地方 ?我的查询应该如何?
我已经尝试了很多选项,我在Stack上传递了所有可能的问题,但我无法完成它。
提前致谢!
更新:
这是我在PostContent存储库中找到所有方法时得到的结果。
答案 0 :(得分:0)
您可以为实体创建存储库类,例如:
CMS/GBundle/Repository/PostContentRepository.php
<?php
namespace CMS\GBundle\Repository;
use Doctrine\ORM\EntityRepository;
class PostContentRepository extends EntityRepository
{
public function getPostsWithCategories()
{
$qb = $this->createQueryBuilder('post_content')
->select(['post_content', 'post_categories'])
->join('post_content.categories', 'post_categories')
;
return $qb->getQuery()->getResult();
}
}
CMS/GBundle/Entity/PostContent.php
<?php
namespace CMS\GBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Table()
* @ORM\Entity(repositoryClass="CMS\GBundle\Repository\PostContentRepository")
*/
class PostContent
{
/* Your entity properties and methods */
}
然后你可以在任何地方使用它。例如,在控制器中:
<?php
namespace CMS\GBundle\Controller;
use ;
class SomeController extends Controller
{
public function someAction()
{
$posts = $this->getDoctrine()
->getManager()
->getRepository('CMSGBundle:PostContent')
->getPostsWithCategories()
;
/* Your logic */
}
}
答案 1 :(得分:0)
建立关系的首选方法是像你一样创建你的实体,然后运行一个控制台命令来扩展你的实体与一些getter和setter:
$ bin/console doctrine:generate:entities AppBundle
然后让doctrine创建你的表:
$ bin/console doctrine:schema:update --force
现在已经准备好了,你必须填写数据库表中的一些数据。
$category = new Category();
$categroy->setName('PHP Programming');
$em->persist($category);
$post = new Post();
$post->setTitle('My first Blogpost');
$post->addCategory($category);
$em->persist($post);
$em->flush();
之后可以解决它。我给你举个例子
public function indexAction($id)
{
$em = $this->getDoctrine()->getManager();
$category= $em->getRepository('AppBundle:PostCategory')->find($id);
// test
foreach($category->getPosts() as $post)
{
echo $post->getTitle() . '<br>';
}
}
要立即加载所有帖子而不是延迟加载我建议在CategoryRepository类中编写您自己的查询,并更改您自己的方法名称的find()方法名称。
答案 2 :(得分:0)
正如Frankbeen建议我创建自定义查询一样:
public function getPostCategories() {
$data = $this->createQueryBuilder('c')
->select('c.id, pc.name')
->innerJoin('CMSGBundle:PostToCategory', 'ptc', 'WITH', 'ptc.postId = c.id')
->innerJoin('CMSGBundle:PostCategory', 'pc', 'WITH', 'ptc.categoryId = pc.id')
->getQuery()
->getArrayResult();
return $data;
}
在上面的方法中,我只提取与post_to_category_post_id类别名称相关的post.id
在控制器中,我生成两个查询,一个用于获取所有Posts,以使用getPostCategories方法获取数据。
控制器:
$em = $this->getDoctrine()->getManager();
$posts = $em->getRepository('CMSGBundle:PostContent')->findAll();
$postCategories = $em->getRepository('CMSGBundle:PostContent')->getPostCategories();
查看:
{% for post in posts %}
{% for category in categories %}
{% if category.id == post.id %}
{{ category.name }}
{% endif %}
{% endfor %}
{% endfor %}
我知道这不是最好的解决方案,如果有人可以建议我使用相同的代码或如何更好地编写代码,我将不胜感激!