与参考表(Doctrine 2,ZF2)的两个一对多关系
我的多对多关系存在问题。我想要访问查询构建器查询的参考表。有了多对多的关系,我无法访问我的参考表,所以我建立了两个一对多的关系。我的结构上看喜欢:与参考表(Doctrine 2,ZF2)的两个一对多关系
User ---> UserUserCategory <--- UserCategory
上述结构有两个一个一对多的关系,并与数据库工作的罚款。当我有与数据库(在UserUserCategory)以下数据的用户:
Table User
ID | Name
1 | Bart
2 | Gerard
Table Category
ID | Name
1 | Officer
2 | Medic
Table UserUserCategory
User | Category
1 | 1
2 | 2
所以巴特是官和杰拉德是一名医生。但是当我想要检索数据时,它说Bart是Medic,Gerard在这个类别中有一个“空值”。
我的用户实体:
/**
* Entity Class representing a post of our User module.
*
* @ORM\Entity
* @ORM\Table(name="user")
* @ORM\Entity(repositoryClass="User\Repository\UserRepository")
*
*/
class User extends zfcUser implements UserInterface
{
/**
* Categories from user
*
* @ORM\OneToMany(targetEntity="User\Entity\UserUserCategory", mappedBy="user_id", cascade={"remove", "persist"})
* @var UserUserCategory
* @access protected
*/
protected $user_usercategories;
//name & user_id comes here
/**
* Constructor to make a new ArrayCollection for addresses
*
*
*/
public function __construct()
{
$this->user_usercategories = new ArrayCollection();
}
/**
* @param Collection $categories
*/
public function addUserUserCategories(Collection $user_usercategories)
{
foreach ($user_usercategories as $user_usercategorie) {
$user_usercategorie->setUser($this);
$this->user_usercategories->add($user_usercategorie);
}
}
/**
* @param Collection $categories
*/
public function removeUserUserCategories(Collection $user_usercategories)
{
foreach ($user_usercategories as $user_usercategorie) {
$user_usercategorie->setUser(null);
$this->user_usercategories->removeElement($user_usercategorie);
}
}
/**
* @return Collection
*/
public function getUserUserCategories()
{
return $this->categories;
}
}
我UserCategory实体:
/**
* A User category entity.
* @ORM\Entity
* @ORM\Table(uniqueConstraints={@ORM\UniqueConstraint(name="unique_name_parentId", columns={"name", "parent_id"})})
* @ORM\HasLifecycleCallbacks
*/
class UserCategory extends Category
{
/**
* User_usercategories
*
* @ORM\OneToMany(targetEntity="User\Entity\UserUserCategory", mappedBy="category_id")
* @var UserUserCategory
* @access protected
*/
protected $user_usercategories;
/**
* Constructor
*/
public function __construct()
{
$this->user_usercategories = new ArrayCollection();
}
/**
* @param Collection $categories
*/
public function addUserUserCategories(Collection $user_usercategories)
{
foreach ($user_usercategories as $user_usercategorie) {
$user_usercategorie->setCategory($this);
$this->user_usercategories->add($user_usercategorie);
}
}
/**
* @param Collection $categories
*/
public function removeUserUserCategories(Collection $user_usercategories)
{
foreach ($user_usercategories as $user_usercategorie) {
$user_usercategorie->setCategory(null);
$this->user_usercategories->removeElement($user_usercategorie);
}
}
/**
* @return Collection
*/
public function getUserUserCategories()
{
return $this->categories;
}
}
我UserUserCategory实体:
/**
* Entity Class representing a post of our User_UserCategory entity.
*
* @ORM\Entity
* @ORM\Table(name="user_usercategory")
*
*/
class UserUserCategory
{
/**
* User with a category
*
* @ORM\ManyToOne(targetEntity="User\Entity\User", inversedBy="user_usercategories")
* @ORM\JoinColumn(name="user_id", referencedColumnName="user_id", nullable=false, onDelete="CASCADE")
* @ORM\Id
*
* @var User
* @access protected
*/
protected $user_id;
/**
* Category from user
*
* @ORM\ManyToOne(targetEntity="User\Entity\UserCategory", inversedBy="user_usercategories")
* @ORM\JoinColumn(name="category_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
* @ORM\Id
*
* @var Category
* @access protected
*/
protected $category_id;
public function getUser()
{
return $this->user;
}
/**
* Set User
*
* @param User $user
* @return User
*/
public function setUser(User $user = null)
{
//die('setUser');
$this->user = $user;
return $this;
}
public function getCategory()
{
return $this->category;
}
/**
* Set Category
*
* @param Category $category
* @return Category
*/
public function setCategory(Category $category = null)
{
$this->category = $category;
return $this;
}
}
当我执行以下行时,它会返回错误的结果。弹出错误的类别:
\ Doctrine \ Common \ Util \ Debug :: dump($ this-> getEntityManager() - > find('User \ Entity \ User','49') - > user_usercategories); 死亡;
结果:
array(1) {
[0]=>
object(stdClass)#452 (3) {
["__CLASS__"]=>
string(28) "User\Entity\UserUserCategory"
["user_id"]=>
string(16) "User\Entity\User"
["category_id"]=>
string(24) "User\Entity\UserCategory"
}
}
在CATEGORY_ID是军医印刷,我希望官员要回。
在我的其他用户(id = 60)中,category_id字段为“null”。所以它看起来很喜欢Doctrine跳过我UserUserCategory中的第一个输入,从第二个开始,不能再获得最后一个类。
没有冒犯,但我觉得你的代码很难阅读。我建议你做一些修正,甚至可以帮助你解决问题。
1:命名:代替UserCategory,将其重命名为Category。像
public function addCategory(Category $category)
{
$reference = new UserCategory() ;
$reference->setUser($this) ;
$reference->setCategory($category) ;
$this->user_categories->add($reference) ;
}
public function removeCategory(Category $category)
{
foreach($this->user_categories as $reference) {
if ($reference->getCategory() === $category)
$this->user_categories->removeElement($reference) ;
}
}
Symfony2的相反addCategories(收集$阵列)的,做单一版本automaticaly:如果你的等级都会有不同的类型,创建constansts与值的新栏目 “型” 之类
class Category
{
const TYPE_USER = 1 ;
....
2认识到这样的方法。即使你的关系是复数(如类别),S2会发现singularified addCategory和removeCategory方法。
要获得类别的阵列,使用此:
public function getCategories()
{
$categories = new ArrayCollection() ;
foreach($this->user_categories as $reference) {
$categories->add($reference->getCategory()) ;
}
return $categories ;
}
如果你不喜欢这样,你可能会解决你的问题。
我的问题现在已修复。我在参考表中使用了一个ID。所以我没有两个标识符了。而且我没有使用Symfony,而是使用Zend框架2(标题)。 UserCategory实体从Category实体扩展,因为会有更多的类别(内容,用户,角色)。还是谢谢你的回答。 – Haidy 2013-05-14 14:20:26