3

我有两个实体产品和类别,我已经成功地创建了一个多对多关系,因此创建了一个新表,如下所示:

┌────────────────┐         ┌───────────────────┐         ┌────────────────┐
|  products      |         | product_categories|         |     categories |
├────────────────┤         ├───────────────────┤         ├────────────────┤
| id#            ├---------┤ product_id        |    ┌----┤ id#            |
| --             |         | cat_id            ├----┘    | --             |
| --             |         |                   |         |                |
└────────────────┘         └───────────────────┘         └────────────────┘

类别

  /**
 * @ORM\ManyToMany(targetEntity="Products", mappedBy="category")
 */
protected $product;

产品

 /**
 * @ORM\ManyToMany(targetEntity="categories", inversedBy="product")
 * @ORM\JoinTable(name="product_categories",
 *      joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="cat_id", referencedColumnName="id")}
 *      )
 **/
protected $category;

现在我希望 product 和 cat_id 在 product_categories 表中是唯一的。怎么做?

4

1 回答 1

7

如果您隐式指定多对多关系,例如通过注释 ( @ManyToMany) 学说将创建包含两个字段的复合主键:product_id 和 cat_id,因此您可以保证它是唯一的。

如果您通过附加实体(比如说)明确指定多对多关联ProductCategories,则可以添加 UniqueEntity 约束。

UniqueEntity 约束文档

带有注释的示例:

use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Entity
 * (...)
 * @UniqueEntity(fields={"product_id", "cat_id"})
 */
class ProductCategories {
    // (...)

编辑:

此外,请确保您已正确生成数据库。您应该使用 Doctrine 的命令来执行此操作(不要手动执行!):

php -f ./app/console doctrine:database:drop
php -f ./app/console doctrine:database:create
php -f ./app/console doctrine:schema:create 

这样,Doctrine 将根据您的实体创建适当的数据库模式。如果您将来要更改任何内容(在您的实体中),您将能够更新您的架构:

php -f ./app/console doctrine:schema:update --force

(使用上述大多数命令,您还可以添加--dump-sql参数,从而仅显示 sql 而不是更改数据库)

于 2013-09-19T12:43:58.013 回答