2013-05-14 110 views
0

我的多对多关系存在问题。我想要访问查询构建器查询的参考表。有了多对多的关系,我无法访问我的参考表,所以我建立了两个一对多的关系。我的结构上看喜欢:与参考表(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

没有冒犯,但我觉得你的代码很难阅读。我建议你做一些修正,甚至可以帮助你解决问题。

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 ; 
} 

如果你不喜欢这样,你可能会解决你的问题。

+0

我的问题现在已修复。我在参考表中使用了一个ID。所以我没有两个标识符了。而且我没有使用Symfony,而是使用Zend框架2(标题)。 UserCategory实体从Category实体扩展,因为会有更多的类别(内容,用户,角色)。还是谢谢你的回答。 – Haidy 2013-05-14 14:20:26

相关问题