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

问题描述

| 如何保存一条记录(该记录来自一项服务),该记录的一项属性设置为与另一个实体的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...
}
但是,当我尝试保存用户和country属性时(设置了一个指向OnetoMany关系oneUser-manyCountries的集合),我得到了“类不存在”的异常。 编辑:用户和国家实体
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\",nullable=true)
 * @var string
 */
private $password;

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

/**
 * @Column(type=\"string\",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\",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;
}

}
    

解决方法

        阅读文档“使用关联”。特别是“协会管理方法”部分。那应该给您一个关于如何向关联添加记录的想法。您没有设置User类/实体,所以我假设您正在初始化__construct中的\“ countries \”字段。同样,您的错误表明自动装带器无法找到User类或Country类,在您的示例中的“'use \”语句中我没有看到您导入的类。错误可能是因为此,可能是导致您无法前进的原因。     ,        我看不到向用户添加国家/地区的代码行。如果要向用户添加国家/地区,请记住您的
$this->countries
是一个集合,您需要以此方式进行威胁。您使用的神奇的二传手将无法用于收藏。 要将国家/地区添加到用户,您还必须将用户添加到该国家/地区:
$User->countries->add($CountryObject);
$CountryObject->user = $User;
然后将其保存到数据库中:
$EntityManager->persist($User);
$EntityManager->persist($CountryObject);
$EntityManager->flush();
祝好运! @ la_f0ka 您在这里有两个选择。在您以前的方法中,您的魔幻二传手无法正常工作,但您的魔幻吸气剂还可以。您可以继续使用
$user->email
代替
$user->getEmail()
。两者都很好。有人说神奇的吸气剂要慢一些,但我从未注意到。 只是不要公开访问您的属性。这破坏了封装,而封装是面向对象编程的最大力量之一。