我在上一个项目中使用过ArrayCollections,工作正常。现在在我的新项目中,我试图实现一个,即使我在两个项目中都做了同样的事情,它也不能完全运行。
什么有效: 我可以在ArrayCollection中添加一个新元素,当我打印出对象实体的概述时,我会在同一方法中看到我在保持和刷新之前和之后放入的元素。
什么行不通: 当我尝试从实体获取ArrayCollection时,它什么都不返回。当我做getype($ collection)时,我也得到null。
代码:
这是两个实体的代码。用户是包含ArrayCollection(电子邮件)的实体,而Email是我想要添加到ArrayCollection中的实体。请注意,两个实体名称的不一致是故意进行的。
Users.cpp(实体)
<?php
namespace HRPortal\SystemBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
/**
* Users
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="HRPortal\SystemBundle\Entity\UsersRepository")
*/
class Users
{
// ...
/**
* @var emails[]
*
* $ORM\OneToMany(targetEntity="Email", mappedBy="user", indexBy="id")
*/
private $emails;
/**
* Constructor for the class. Sets createdAt to Now
*
*/
public function __construct()
{
// ...
$this->emails = new ArrayCollection();
}
/**
* Get value for data '$name'
* @param string $name
* @return Type of data '$name'
*/
public function __get($name)
{
return $this->$name;
}
/**
* Set value for data '$name'
* @param string $name
* @param generic $value
* @return Type of data '$name'
*/
public function __set($name, $value)
{
$this->$name = $value;
return $this;
}
public function offsetGet($name)
{
return $this->$name;
}
}
Email.php(实体)
<?php
namespace HRPortal\SystemBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Email
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="HRPortal\SystemBundle\Entity\EmailRepository")
*/
class Email
{
// ...
/**
* @var integer
*
* @ORM\ManyToOne(targetEntity="Users", inversedBy="emails")
*/
private $user;
/**
* @var string
*
* @ORM\Column(name="email", type="string", length=255)
*/
private $email;
// ...
}
来自控制器的部分代码
$email = new Email();
$user->password = $bcrypt->hash($user->password);
$user->emails->add($email);
// print_r($user) will show data from $email (Emails Entity)
$email->email = $form->get('email')->getData();
$email->is_default = true;
$email->user = $user;
$em->persist($email);
$em->persist($user);
$em->flush();
// print_r($user) will also show data from $email (of course)
但是,当我稍后尝试访问它时:
public function getDefaultEmail($user)
{
// print_r($user) will leave 'emails' empty but print out any other data
// print_r($user->emails) will not show anything
// Getting an error when accessing foreach, as $user->emails is null
foreach ($user->emails as $email) {
if($email->is_default === true){
return $email->email;
}
}
return false;
}
有什么建议吗?
谢谢
答案 0 :(得分:0)
编辑:
您的电子邮件是否在DB中正确注册?
您可能忘记了ORM / JoinColumn。
Email.php
<?php
// ...
/**
* @var integer
*
* @ORM\ManyToOne(targetEntity="Users", inversedBy="emails")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
// ...