Symfony2 实体多对一
Symfony2 Entity ManyToOne
Impossible to access an attribute ("name") on a null variable in
messages\index.html.twig at line 11
{{ message.author.name }} -- 正在工作
{{ message.recipient.name }} -- 不是,我不知道为什么一切都和作者一样
树枝:
Nadawca: {{ message.author.name }} {{ message.author.surname }}
Odbiorca: {{ message.recipient.name }} {{ message.recipient.surname }}
控制器:
public function indexAction() {
$limit = 100;
$em = $this->getDoctrine()->getManager();
$user_data = $this->get('security.token_storage')->getToken()->getUser();
$repository = $this->getDoctrine()->getRepository('AppBundle:Messages');
$query = $repository->createQueryBuilder('m')->where('m.author = :authorid')
->orWhere('m.recipient = :authorid')
->setParameter('authorid', $user_data->getId())
->getQuery();
$messages = $query->getResult();
return $this->render('messages/index.html.twig', array(
'messages' => $messages,
'user' => $user_data,
));
}
实体用户:
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=100)
*/
private $name;
/**
* @ORM\Column(type="string", length=100)
*/
private $surname;
/**
* @ORM\OneToMany(targetEntity="Articles", mappedBy="author")
*/
private $articles;
/**
* @ORM\OneToMany(targetEntity="Messages", mappedBy="author")
*/
private $messages_author;
/**
* @ORM\OneToMany(targetEntity="Messages", mappedBy="recipient")
*/
private $messages_recipient;
public function __construct()
{
parent::__construct();
$this->messages_recipient = new ArrayCollection();
$this->messages_author = new ArrayCollection();
$this->articles = new ArrayCollection();
}
实体消息:
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=100)
*/
private $title;
/**
* @ORM\Column(type="text", length=16777216)
*/
private $text;
/**
* @ORM\Column(type="integer", options={"default" = 1})
*/
private $published;
/**
* @ORM\Column(name="date", type="datetime")
*/
private $date;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="messages_author")
* @ORM\JoinColumn(name="author_id", referencedColumnName="id")
*/
private $author;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="messages_recipient")
* @ORM\JoinColumn(name="recipient_id", referencedColumnName="id")
*/
private $recipient;
public function __construct()
{
$this->date = new \DateTime("now");
}
您的错误意味着一封或多封邮件中没有收件人。遍历您从数据库中检索的所有消息,并检查其中是否有收件人为 NULL。或者使用简单的 SELECT * FROM message WHERE recipient_id IS NULL
.
快速查询数据库
这是延迟加载造成的。首先,您的 Message 实体中的 author
和 recipient
都是空对象或 Proxy 对象。一旦 属性 被访问,doctrine 将尝试将关联的用户实体加载到消息中。因此,当您调用 {{ message.recipient.name }}
而您的 message.recipient
实际上不是 return 用户实体时,它将保持 NULL 从而导致错误,指出它无法访问 属性 name
在 NULL 上。
Impossible to access an attribute ("name") on a null variable in messages\index.html.twig at line 11
{{ message.author.name }} -- 正在工作
{{ message.recipient.name }} -- 不是,我不知道为什么一切都和作者一样
树枝:
Nadawca: {{ message.author.name }} {{ message.author.surname }}
Odbiorca: {{ message.recipient.name }} {{ message.recipient.surname }}
控制器:
public function indexAction() {
$limit = 100;
$em = $this->getDoctrine()->getManager();
$user_data = $this->get('security.token_storage')->getToken()->getUser();
$repository = $this->getDoctrine()->getRepository('AppBundle:Messages');
$query = $repository->createQueryBuilder('m')->where('m.author = :authorid')
->orWhere('m.recipient = :authorid')
->setParameter('authorid', $user_data->getId())
->getQuery();
$messages = $query->getResult();
return $this->render('messages/index.html.twig', array(
'messages' => $messages,
'user' => $user_data,
));
}
实体用户:
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=100)
*/
private $name;
/**
* @ORM\Column(type="string", length=100)
*/
private $surname;
/**
* @ORM\OneToMany(targetEntity="Articles", mappedBy="author")
*/
private $articles;
/**
* @ORM\OneToMany(targetEntity="Messages", mappedBy="author")
*/
private $messages_author;
/**
* @ORM\OneToMany(targetEntity="Messages", mappedBy="recipient")
*/
private $messages_recipient;
public function __construct()
{
parent::__construct();
$this->messages_recipient = new ArrayCollection();
$this->messages_author = new ArrayCollection();
$this->articles = new ArrayCollection();
}
实体消息:
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORM\Column(type="string", length=100)
*/
private $title;
/**
* @ORM\Column(type="text", length=16777216)
*/
private $text;
/**
* @ORM\Column(type="integer", options={"default" = 1})
*/
private $published;
/**
* @ORM\Column(name="date", type="datetime")
*/
private $date;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="messages_author")
* @ORM\JoinColumn(name="author_id", referencedColumnName="id")
*/
private $author;
/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="messages_recipient")
* @ORM\JoinColumn(name="recipient_id", referencedColumnName="id")
*/
private $recipient;
public function __construct()
{
$this->date = new \DateTime("now");
}
您的错误意味着一封或多封邮件中没有收件人。遍历您从数据库中检索的所有消息,并检查其中是否有收件人为 NULL。或者使用简单的 SELECT * FROM message WHERE recipient_id IS NULL
.
这是延迟加载造成的。首先,您的 Message 实体中的 author
和 recipient
都是空对象或 Proxy 对象。一旦 属性 被访问,doctrine 将尝试将关联的用户实体加载到消息中。因此,当您调用 {{ message.recipient.name }}
而您的 message.recipient
实际上不是 return 用户实体时,它将保持 NULL 从而导致错误,指出它无法访问 属性 name
在 NULL 上。