Join table symfony2中的唯一ID

Sha*_*aun 2 php symfony doctrine-orm

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

??????????????????         ?????????????????????         ??????????????????
|  products      |         | product_categories|         |     categories |
??????????????????         ?????????????????????         ??????????????????
| id#            ?---------? product_id        |    ?----? id#            |
| --             |         | cat_id            ?----?    | --             |
| --             |         |                   |         |                |
??????????????????         ?????????????????????         ??????????????????
Run Code Online (Sandbox Code Playgroud)

分类

  /**
 * @ORM\ManyToMany(targetEntity="Products", mappedBy="category")
 */
protected $product;
Run Code Online (Sandbox Code Playgroud)

制品

 /**
 * @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;
Run Code Online (Sandbox Code Playgroud)

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

Cyp*_*ian 6

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

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

UniqueEntity约束文档

注释示例:

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

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

编辑:

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

php -f ./app/console doctrine:database:drop
php -f ./app/console doctrine:database:create
php -f ./app/console doctrine:schema:create 
Run Code Online (Sandbox Code Playgroud)

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

php -f ./app/console doctrine:schema:update --force
Run Code Online (Sandbox Code Playgroud)

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