Почему объединение таблиц не работает в symfony2?

0

Мой Post.php

<?php
// src/Acme/UserBundle/Entity/User.php

namespace Acme\PostBundle\Entity;


use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * @ORM\Entity
 * @ORM\Table(name="posts")
 */
class Post
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     *
     * @ORM\Column(type="integer")
     */
    public $user_id;
    /**
     * @ORM\ManyToOne(targetEntity="Acme\PostBundle\Entity\User", inversedBy="posts")
     * @ORM\JoinColumn(name="id", referencedColumnName="id")
     */
    protected $user;
    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank(message="Введите текст")
     * )
     */
    protected $text;

    /**
     * @ORM\Column(type="string", length=255)
     */
    protected $address;
    /**
     *
     * @ORM\Column(type="datetime")
     */
    protected $date;



}

И мой User.php:

<?php
// src/Acme/UserBundle/Entity/User.php

namespace Acme\PostBundle\Entity;


use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
    */
    protected $id;
    /**
     *
     * @ORM\Column(type="string")
     */
    protected $path;

    /**
    * @ORM\OneToMany(targetEntity="Acme\PostBundle\Entity\Post", mappedBy="users")
    */
    protected $posts;

    public function __construct() {

        $this->posts = new ArrayCollection();

    }


}

Я хочу, чтобы пользователи join join и столбцы добавляли столбец user_id в таблице "posts". Затем я делаю запрос с помощью queryBuilder:

    $repository = $this->getDoctrine()->getManager()->getRepository('AcmePostBundle:Post');


    $queryPosts = $repository->createQueryBuilder('p')
                   ->orderBy('p.id', 'DESC')
                   ->getQuery();

    return new Response(var_dump($queryPosts->getResult()));

И я получаю:

object(Acme\PostBundle\Entity\Post)[476]
      protected 'id' => int 1
      public 'user_id' => int 1
      protected 'user' => 
        object(Proxies\__CG__\Acme\PostBundle\Entity\User)[475]
          public '__initializer__' => 
            object(Closure)[469]
              ...
          public '__cloner__' => 
            object(Closure)[470]
              ...
          public '__isInitialized__' => boolean false
          protected 'id' => int 1
          protected 'path' => null
          protected 'posts' => null
      protected 'text' => string 'Test' (length=4)
      protected 'address' => string 'Test' (length=4)
      protected 'date' => 
        object(DateTime)[477]
          public 'date' => string '2014-11-06 14:39:13' (length=19)
          public 'timezone_type' => int 3
          public 'timezone' => string 'Europe/Kiev' (length=11)

Почему путь user-> равен нулю? Как сделать, чтобы это объединялось в таблицу

Теги:
doctrine2

1 ответ

1
Лучший ответ

Doctrine использует методы ленивой загрузки при использовании вспомогательных функций, таких как find() или findAll() которые запрашивают связанные объекты по требованию, но когда вы используете Query Builder, вы создаете явные запросы/результаты, которые не обрабатываются Doctrine lazy -loader.

При использовании Query Builder вы должны явно присоединиться к другим связанным объектам:

$queryPosts = $this->getDoctrine()->getManager()->createQueryBuilder()
               ->select('p, u')
               ->from('AcmePostBundle:Post', 'p')
               ->leftJoin('p.user','u') // handles the ManyToOne association automatically
               ->orderBy('p.id', 'DESC')
               ->getQuery();

Обратите внимание, что вы можете легко использовать innerJoin вместо leftJoin но leftJoin на это, если у вас были потенциальные Post с нулевой ассоциацией.

Вы также должны убедиться, что ваше отображение объектов верное:

/**
 * @ORM\ManyToOne(targetEntity="Acme\PostBundle\Entity\User", inversedBy="posts")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
protected $user;

Или Doctrine попытается сопоставить id сообщения с id пользователя. (что-то вроде LEFT JOIN Post ON Post.id = User.id к моменту достижения необработанного запроса)

  • 0
    Это работает, но теперь я получаю это: pastebin.com/C9NUXcwT
  • 0
    @ivaaaan Отредактируйте свой вопрос, однако вы должны создавать новый Вопрос, поскольку любая новая проблема, с которой вы столкнулись, не связана с этой.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню