Doctrine ORM 将产品绑定到多个实体
Doctrine ORM Bind Product to Multiple Entities
我有商家、类别和产品。类别分配给企业,产品分配给类别和企业。
原因是,一种产品可以分配给不同商家的不同类别。
业务和类别实体工作正常,但我不确定如何编写产品实体来实现我需要的...
企业实体:
namespace Raiel\AFMage\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
* @ORM\Table(name="businesses")
*/
class Business {
/**
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", name="id")
*/
private $id;
/**
* @ORM\Column(name="name", type="string", length=64)
*/
private $name;
/**
*
* @ORM\ManyToMany(targetEntity="Category", inversedBy="businesses")
* @ORM\JoinTable(
* name="business_categories",
* joinColumns={
* @ORM\JoinColumn(name="business_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
* }
* )
*/
private $categories;
/**
* Default constructor, initializes collections
*/
public function __construct() {
$this->categories = new ArrayCollection();
}
}
类别实体:
<?php
namespace Raiel\AFMage\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @Gedmo\Tree(type="nested")
* @ORM\Table(name="categories")
* @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
*/
class Category {
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
private $id;
/**
*
* @ORM\ManyToMany(targetEntity="Business", mappedBy="categories")
*/
private $businesses;
/**
* @Gedmo\TreePath
* @ORM\Column(name="path", type="string", length=3000, nullable=true)
*/
private $path;
/**
* @ORM\Column(name="title", type="string", length=64)
*/
private $title;
/**
* @Gedmo\TreeLevel
* @ORM\Column(name="lvl", type="integer")
*/
private $lvl;
/**
* @Gedmo\TreeLeft
* @ORM\Column(name="lft", type="integer")
*/
private $lft;
/**
* @Gedmo\TreeRight
* @ORM\Column(name="rgt", type="integer")
*/
private $rgt;
/**
* @Gedmo\TreeRoot
* @ORM\Column(name="root", type="integer", nullable=true)
*/
private $root;
/**
* @Gedmo\TreeParent
* @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $parent;
/**
* @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
* @ORM\OrderBy({"lft" = "ASC"})
*/
private $children;
/**
* Constructor
*/
public function __construct() {
$this->children = new ArrayCollection();
$this->businesses = new ArrayCollection();
}
}
此外,$business->addCategory 工作正常,但 $category->addBusiness 没有保存到数据库。
您的产品实体可能类似于:
namespace Raiel\AFMage\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
* @ORM\Table(name="products")
*/
class Product {
/**
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", name="id")
*/
private $id;
/**
* @ORM\Column(name="name", type="string", length=64)
*/
private $name;
/**
*
* @ORM\ManyToMany(targetEntity="Category", inversedBy="products")
* @ORM\JoinTable(
* name="product_categories",
* joinColumns={
* @ORM\JoinColumn(name="product_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
* }
* )
*/
private $categories;
/**
*
* @ORM\ManyToMany(targetEntity="Business", inversedBy="products")
* @ORM\JoinTable(
* name="product_businesses",
* joinColumns={
* @ORM\JoinColumn(name="product_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="business_id", referencedColumnName="id")
* }
* )
*/
private $businesses;
}
您的业务实体或多或少具有使用不同联接的 ManyToMany 关系 table。
要使 $category->addBusiness()
正常工作,您可能需要向类别添加 cascade
选项,因此:
/**
*
* @ORM\ManyToMany(targetEntity="Business", mappedBy="categories", cascade="persist")
*/
private $businesses;
这会通知 Doctrine,任何新添加到 $businesses
数组集合的东西都应该被持久化,查看 documentation 了解详情。
我有商家、类别和产品。类别分配给企业,产品分配给类别和企业。
原因是,一种产品可以分配给不同商家的不同类别。
业务和类别实体工作正常,但我不确定如何编写产品实体来实现我需要的...
企业实体:
namespace Raiel\AFMage\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
* @ORM\Table(name="businesses")
*/
class Business {
/**
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", name="id")
*/
private $id;
/**
* @ORM\Column(name="name", type="string", length=64)
*/
private $name;
/**
*
* @ORM\ManyToMany(targetEntity="Category", inversedBy="businesses")
* @ORM\JoinTable(
* name="business_categories",
* joinColumns={
* @ORM\JoinColumn(name="business_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
* }
* )
*/
private $categories;
/**
* Default constructor, initializes collections
*/
public function __construct() {
$this->categories = new ArrayCollection();
}
}
类别实体:
<?php
namespace Raiel\AFMage\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @Gedmo\Tree(type="nested")
* @ORM\Table(name="categories")
* @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
*/
class Category {
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
private $id;
/**
*
* @ORM\ManyToMany(targetEntity="Business", mappedBy="categories")
*/
private $businesses;
/**
* @Gedmo\TreePath
* @ORM\Column(name="path", type="string", length=3000, nullable=true)
*/
private $path;
/**
* @ORM\Column(name="title", type="string", length=64)
*/
private $title;
/**
* @Gedmo\TreeLevel
* @ORM\Column(name="lvl", type="integer")
*/
private $lvl;
/**
* @Gedmo\TreeLeft
* @ORM\Column(name="lft", type="integer")
*/
private $lft;
/**
* @Gedmo\TreeRight
* @ORM\Column(name="rgt", type="integer")
*/
private $rgt;
/**
* @Gedmo\TreeRoot
* @ORM\Column(name="root", type="integer", nullable=true)
*/
private $root;
/**
* @Gedmo\TreeParent
* @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
* @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $parent;
/**
* @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
* @ORM\OrderBy({"lft" = "ASC"})
*/
private $children;
/**
* Constructor
*/
public function __construct() {
$this->children = new ArrayCollection();
$this->businesses = new ArrayCollection();
}
}
此外,$business->addCategory 工作正常,但 $category->addBusiness 没有保存到数据库。
您的产品实体可能类似于:
namespace Raiel\AFMage\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity()
* @ORM\Table(name="products")
*/
class Product {
/**
* @ORM\Id()
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer", name="id")
*/
private $id;
/**
* @ORM\Column(name="name", type="string", length=64)
*/
private $name;
/**
*
* @ORM\ManyToMany(targetEntity="Category", inversedBy="products")
* @ORM\JoinTable(
* name="product_categories",
* joinColumns={
* @ORM\JoinColumn(name="product_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="category_id", referencedColumnName="id")
* }
* )
*/
private $categories;
/**
*
* @ORM\ManyToMany(targetEntity="Business", inversedBy="products")
* @ORM\JoinTable(
* name="product_businesses",
* joinColumns={
* @ORM\JoinColumn(name="product_id", referencedColumnName="id")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="business_id", referencedColumnName="id")
* }
* )
*/
private $businesses;
}
您的业务实体或多或少具有使用不同联接的 ManyToMany 关系 table。
要使 $category->addBusiness()
正常工作,您可能需要向类别添加 cascade
选项,因此:
/**
*
* @ORM\ManyToMany(targetEntity="Business", mappedBy="categories", cascade="persist")
*/
private $businesses;
这会通知 Doctrine,任何新添加到 $businesses
数组集合的东西都应该被持久化,查看 documentation 了解详情。