问题描述
|
如何保存一条记录(该记录来自一项服务),该记录的一项属性设置为与另一个实体的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()
。两者都很好。有人说神奇的吸气剂要慢一些,但我从未注意到。
只是不要公开访问您的属性。这破坏了封装,而封装是面向对象编程的最大力量之一。