两个一对多关系与引用表(原则2,ZF2)



我有一个问题与我的多对多关系。我想要访问一个querybuilder查询的参考表。对于多对多关系,我不能访问我的引用表,所以我设置了两个一对多关系。我的结构看起来像:

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

所以巴特是一名军官,杰拉德是一名医生。但当我想检索数据时,显示巴特是医生,而杰拉德的分类值为"空"

我User-entity

:

/**
 * Entity Class representing a post of our User module.
 * 
 * @ORMEntity
 * @ORMTable(name="user")
 * @ORMEntity(repositoryClass="UserRepositoryUserRepository")
 * 
 */
class User extends zfcUser implements UserInterface
{
    /**
     * Categories from user
     * 
     * @ORMOneToMany(targetEntity="UserEntityUserUserCategory", 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-entity

:

/**
 * A User category entity.
 * @ORMEntity
 * @ORMTable(uniqueConstraints={@ORMUniqueConstraint(name="unique_name_parentId", columns={"name", "parent_id"})})
 * @ORMHasLifecycleCallbacks
 */
class UserCategory extends Category
{    
    /**
     * User_usercategories
     * 
     * @ORMOneToMany(targetEntity="UserEntityUserUserCategory", 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

:

/**
 * Entity Class representing a post of our User_UserCategory entity.
 * 
 * @ORMEntity
 * @ORMTable(name="user_usercategory")
 * 
 */
class UserUserCategory
{
    /**
     * User with a category
     * 
     * @ORMManyToOne(targetEntity="UserEntityUser", inversedBy="user_usercategories")
     * @ORMJoinColumn(name="user_id", referencedColumnName="user_id", nullable=false, onDelete="CASCADE")
     * @ORMId
     * 
     * @var User
     * @access protected
     */
    protected $user_id;
    /**
     * Category from user
     * 
     * @ORMManyToOne(targetEntity="UserEntityUserCategory", inversedBy="user_usercategories")
     * @ORMJoinColumn(name="category_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
     * @ORMId
     * 
     * @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;
    }
}

当我执行下面这行时,它返回了错误的结果。弹出错误的类别:

学说 Util 调试::转储($ this -> getEntityManager() ->找到("用户实体 用户","49")——> user_usercategories);死;

结果:

array(1) {
  [0]=>
  object(stdClass)#452 (3) {
    ["__CLASS__"]=>
    string(28) "UserEntityUserUserCategory"
    ["user_id"]=>
    string(16) "UserEntityUser"
    ["category_id"]=>
    string(24) "UserEntityUserCategory"
  }
}

在category_id是打印的医务人员,我希望军官回来。

在我的另一个用户(id=60)中,category_id字段为"null"。所以看起来Doctrine跳过了UserUserCategory中的第一个输入,从第二个输入开始,再也不能得到最后一个类别了。

无意冒犯,但我发现您的代码很难阅读。我建议你做一些修改,这甚至可能有助于你解决问题。

1: Naming:将UserCategory重命名为Category而不是UserCategory。如果你的Category有不同的类型,用像

这样的常量的值创建新的列type
 class Category
 {
    const TYPE_USER = 1 ;
    ....

2:代替addCategories(Collection $array),使用单数版本,如

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自动识别这样的方法。即使您的关系是复数的(如类别),s2也会找到单数的addCategory和removeCategory方法。

获取类别数组,使用如下命令:

public function getCategories()
{
    $categories = new ArrayCollection() ;
    foreach($this->user_categories as $reference) {
        $categories->add( $reference->getCategory() ) ;
    }
    return $categories ;
}

如果你这样做,你可能会解决你的问题。

最新更新