Symfony2 / Doctrine - 不返回ArrayCollection对象的实体变量

时间:2013-12-10 15:57:22

标签: php entity-framework symfony doctrine-orm arraycollection

我在上一个项目中使用过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;
}

有什么建议吗?

谢谢

1 个答案:

答案 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;

// ...