我正在研究以下模型:
一个User
只能获得一个Category
。类别是“独立的”。所以我可以随时更新,创建和删除(好吧,也许是级联)类别。
当我创建新的User
时,我希望将Category
引用到User
。
我怎么能这样做?我想避免不良做法。
User
实体:
/**
* User
*
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="XXX\Repository\UserRepository")
*/
class User
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Category", inversedBy="user")
* @ORM\JoinColumn(name="category", referencedColumnName="id")
*/
private $category;
//...
}
Category
实体:
/**
* Category
*
* @ORM\Table(name="category")
* @ORM\Entity(repositoryClass="XXX\Repository\CategoryRepository")
*/
class Category
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity="User", mappedBy="category")
*/
private $user;
//...
}
答案 0 :(得分:0)
您写的User
可以有一个Category
,但从您的描述中可以看出,Category
可以被多个用户使用。如果这是真的,那么您的类别定义应该稍微改变一下:
/**
* Category
*
* @ORM\Table(name="category")
* @ORM\Entity(repositoryClass="XXX\Repository\CategoryRepository")
*/
class Category
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var Collection
* @ORM\OneToMany(targetEntity="User", mappedBy="category")
*/
private $users;
public function __construct()
{
// It is important to initialize your collection
$this->users = new ArrayCollection();
}
// add methods for adding/removing and getting users:
// addUser, removeUser, addUsers, removeUsers and getUsers method
}
在学说文档章节 27.7. Initialize collections in the constructor 中阅读有关初始化集合的更多信息。
然后在User
课程中,您将需要设置和获取类别的方法。
public function setCategory(Category $category)
{
$category->addUser($user);
$this->category = $category;
}
public function getCategory()
{
return $this->category;
}
现在你可以做到:
$category = // get the category you want to set from entity manager
$user = new User();
$user->setCategory($category);
$entityManager->persist($user);
$entityManager->flush();
现在您的用户和类别都已正确设置。 这只是一个帮助您上路的基本示例。