学说2多对多(产品 - 分类)

时间:2013-07-28 21:32:00

标签: php orm doctrine-orm

您好我在项目(产品)和类别之间有多对多关系,我使用这三个实体实现了:

  1. 项目实体:

       /**
     * @Entity 
     * @Table(name="items")
     */
    use Doctrine\Common\Collections\ArrayCollection;
    
    class Item {
    
        /**
         *
         * @Id  @Column(type="integer")
         * @GeneratedValue
         */
        private $id_item;
    
         /** @OneToMany(targetEntity="ItemCategories", mappedBy="item") */
        protected $categories;
    
        public function __construct() {
    
            $this->categories=new ArrayCollection();
        }
    
        public function addCategory(ItemCategories $category){
            $this->categories->add($category);
        }
        public function getCategories(){
            return $this->categories;
        }
    
    }
    

    2加入表(ItemCategories)

         /**
         * @Entity 
         * @Table(name="item_categories")
         */
        class ItemCategories {
    
            /**
             *
             * @Id  @Column(type="integer")
             * @GeneratedValue
             */
            private $id;
    
            /**
             * @Column(type="integer")
             */
            private $id_item;
    
            /**
             * @Column(type="integer")
             */
            private $id_category;
    
            /** @ManyToOne(targetEntity="Category", inversedBy="ItemCategories")
             *  @JoinColumn(name="id_category", referencedColumnName="id_category")
             *  */
            protected $category;
    
            /** @ManyToOne(targetEntity="Item", inversedBy="$categories")
              *  @JoinColumn(name="id_item", referencedColumnName="id_item")
             *  */
            protected $item;
    
            public function getCategory() {
                return $this->category;
            }
    
            public function setCategory($category) {
                $this->category = $category;
            }
    
            public function getItem() {
                return $this->item;
            }
    
            public function setItem($item) {
                $this->item = $item;
            }
    
    
    
        }
    

    3.Categories表

     /**
     * @Entity 
     * @Table(name="categories")
     */
    class Category {
    
        /**
         *
         * @Id  @Column(type="integer")
         * @GeneratedValue
         */
        private $id_category;
    
        /** @OneToMany(targetEntity="ItemCategories", mappedBy="category") */
        protected $ItemCategories;
        /**
         *
         * @Column(type="string") @var string 
         */
    
    
    
    }
    
  2. 现在我的问题是我不知道如何使用EXISTING类别插入项目。 我试过了:

      $item= new Entity\Item();
      $itemCategoriesReferences=new Entity\ItemCategories();
    
       $productCategoriesReferences->setItem($product);
    
      //get existing category from db using PkId
       $itemCategoriesReferences->setCategory($CategoryModel->getCategory(1));
       $item->addCategory(itemCategoriesReferences);
    

    我知道它并没有多大意义,但我没有其他想法,所以请帮助我。

    由于

2 个答案:

答案 0 :(得分:1)

第3个实体仅在您想要设置Category和Item之间的Relation的某些属性时才有用。例如,项目“属于”类别,项目是“建议”添加到类别,项目是“待定”从类别删除。由于您的ItemCategories没有显示任何此类属性,因此您最好按手册指定的方式执行此操作。在此处阅读更多相关信息:http://docs.doctrine-project.org/en/latest/reference/association-mapping.html#many-to-many-bidirectional

答案 1 :(得分:0)

首先,您应该按ItemCategory重命名ItemCategories,因为此项目的实例仅是1个项目和1个类别之间的链接。

然后很简单:

$item = new Item();
$em->persist($item);
$category = $em->getRepository('category')->find($id_category);

$itemCategory =new ItemCategory();
$itemCategory->setItem($item);
$itemCategory->setCategory($category);

$em->persist($itemCategory);