如何使用Doctrine 2保存OneToMany关系字段的记录?

时间:2011-06-21 23:39:31

标签: doctrine-orm doctrine

如何保存一个记录(来自服务),该记录的某个属性设置为与另一个实体的OneToMany关系?

我的用户有以下服务类:

namespace Federico\Entity;
use Federico\Entity\User;
/**
 * Description of UserService
 *
 * @author fiodorovich
 */
class UserService {
protected $em;

public function __construct ($em) {
    $this->em = $em;
}

public function saveUser($user) {
    if ($user['id'] != null) { //update 
        $entity = $this->getUser($user['id']);

        //do something

        if (!$entity)
            throw new Exception('Error saving user!');
    } else { //insert 
        $entity = new User();

        foreach ($user as $k => $v) {
            if ($k !== 'submit') {
                if ($k == 'password') {
                    //echo $this->_salt;die;
                    $entity->$k = $this->createPass($v);
                } else {
                    $entity->$k = $v;
                }
            }
        }
    }
    $this->em->persist($entity);
    $this->em->flush(); //save the user
}

//do something else...
}

但是当我尝试保存用户和countries属性(一个引用OneToMany关系的集合oneUser-manyCountries)时,我得到一个“Class not exists”异常。

编辑:用户和国家/地区实体

namespace Federico\Entity;
use Doctrine\Common\Collections\ArrayCollection;
/**
 * Description of User
 * @Table(name="users")
 * @Entity
 * @author fiodorovich
 */
class User 
{
/**
 * @var integer
 * @Id @Column (name="id", type="integer", nullable=false)
 * @GeneratedValue(strategy="AUTO")
 * 
 */
private $id;

/**
 * @Column(type="string",length=60,nullable=true, unique=true)
 * @var string
 */
private $email;

/**
 * @Column(type="string",length=60,nullable=true)
 * @var string
 */
private $password;

/**
 * @Column(type="string",length=60,nullable=true,unique=true)
 * @var string
 */
private $url;

/**
 * @Column(type="string",length=60,nullable=true,unique=true)
 * @var string
 */
private $responsable;

/**
 * @Column(type="string",length=20,nullable=true)
 * @var string
 */
private $role;

/**
 *
 * @var datetime
 * @Column(type="datetime", nullable=false)
 */
private $created;

/**
 * 
 * @param \Doctring\Common\Collections\Collection $property
 * @OneToMany(targetEntity="Countries",mappedBy="user", cascade={"persist", "remove"})
 */
private $countries;

public function __construct()
{
    $this->created = new \DateTime(date('Y-m-d H:i:s'));
    $this->countries = new ArrayCollection();

}

public function __get($property) 
{
    return $this->$property;
}

public function __set($property, $value)
{
    $this->$property = $value;
}

public function getCountries()
{
    return $this->countries;
}
}

和国家实体:

namespace Federico\Entity;
/**
 * @Table(name="countries")
 * @Entity
 * @author fiodorovich
 * 
 */
class Countries {
/**
 * @var integer
 * @Id @Column (name="id", type="integer", nullable=false)
 * @GeneratedValue(strategy="AUTO")
 * 
 */
private $id;

/**
 *
 * @var string
 * @Column(type="string") 
 */
private $countryName;

/**
 *
 * @var User
 * @ManyToOne(targetEntity="User", inversedBy="id") 
 * @JoinColumns({
 *  @JoinColumn(name="user_id", referencedColumnName="id")
 * })
 */
private $user;


public function __get($property) 
{
    return $this->$property;
}

public function __set($property, $value)
{
    $this->$property = $value;
}

}

2 个答案:

答案 0 :(得分:1)

阅读文档Working With Associations。特别是章节管理方法。这应该可以让您了解如何将记录添加到关联。您没有提出User类/实体,因此我假设您正在初始化__construct中的“countries”字段。此外,您的错误表明自动装带器无法找到User类或Country类,我没有看到您在示例中的'use'语句中导入。错误可能是因为这可能是阻止你前进的原因。

答案 1 :(得分:0)

我没有看到您向用户添加国家/地区的代码行。如果您想向用户添加国家/地区,请记住您的$this->countries是一个集合,您需要以这种方式威胁它。你使用的神奇的二传手不适合收藏。

要向用户添加国家/地区,您还必须将用户添加到该国家/地区:

$User->countries->add($CountryObject);
$CountryObject->user = $User;

然后将其保存到数据库:

$EntityManager->persist($User);
$EntityManager->persist($CountryObject);
$EntityManager->flush();
祝你好运!

@ la_f0ka

这里有两种选择。在你以前的方法中,你的魔法二传手不能正常工作,但是你的魔法吸气器很好。您可以继续使用$user->email代替$user->getEmail()。两者都很好。有人说神奇的吸气剂有点慢,但我从未注意到它。

不要公开访问您的属性。这破坏了你的封装,这是面向对象编程的最大力量之一。