Мой 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-> равен нулю? Как сделать, чтобы это объединялось в таблицу
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
к моменту достижения необработанного запроса)