教义很多很多内在的加入

时间:2016-10-23 12:08:42

标签: symfony doctrine-orm doctrine doctrine-1.2 doctrine-query

我试图与Doctrine和symfony达成许多关系。 我是Doctrine和Symfony的新人。我来自Zend框架。

我创建了3个表格: Post,PostCategory和联结表PostToCategory,如下所示。

Tables example

我的目标是进行内部联接,并为每个帖子获取其类别。 这是我到目前为止所做的:

// 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上传递了所有可能的问题,但我无法完成它。

提前致谢!

更新:

This is what i get when do findAll

这是我在PostContent存储库中找到所有方法时得到的结果。

3 个答案:

答案 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 %}

我知道这不是最好的解决方案,如果有人可以建议我使用相同的代码或如何更好地编写代码,我将不胜感激!