如何在Symfony 4中使用Doctrine使两列的组合唯一?

4

我有一个名为“student_assignment”的表格,其中有多个列,以下是其中的两个:

这两个列也是外键。

StudentId   assignmentId
    10           7           -> allowed
    10           8           -> allowed
    11           7           -> allowed
    11           7           -> not allowed, the combination of 11 7 already exists in table

我在实体文件中尝试过这个方法,但它并没有起作用。
/**
 * Webkul\CampusConnect\Entity\StudentAssignment
 *
 * @Table(name="student_assignment", 
 *    uniqueConstraints={
 *        @UniqueConstraint(name="assignment_unique", 
 *            columns={"student", "assignment"})
 *    }
 * )
 * @Entity
 */

请问如何在Symfony 4中使用ORM来实现这个功能。
我有一个链接,它在MySQL中完成了相同的操作。我想要使用Symfony ORM的解决方案。 进入链接以查看详情 错误:

[语义化错误] 在类Webkul\CampusConnect\Entity\StudentAssignment中的注释“@Table”未被导入。您可能忘记为此注释添加“use”语句了吗?

实体:
namespace Webkul\CampusConnect\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\Table;

/**
 * Webkul\CampusConnect\Entity\StudentAssignment
 *
 * @ORM\Table(name="student_assignment", 
 *    uniqueConstraints={
 *        @UniqueConstraint(name="assignment_unique", 
 *            columns={"student", "assignment"})
 *    }
 * )
 * @Entity
 */
class StudentAssignment
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Webkul\CampusConnect\Entity\Student", inversedBy="studentAssignments")
     * @ORM\JoinColumn(onDelete="CASCADE")
     */
    private $student;

你在实现后更新了数据库吗?或者尝试清除缓存。 - habibun
@habibun:上面的代码给了我一个错误。我已经更新了问题并附上了错误信息,请检查一下。 - Saurabh
1
请放在命名空间后面,use Doctrine\ORM\Mapping\Table; use Doctrine\ORM\Mapping\Table; - habibun
@habibun:我已经使用过它了。我已经更新了我的问题,请检查一下。 - Saurabh
1
清除缓存,重试。 - habibun
2个回答

8

您进行了编辑,但没有使用ORM作为导入别名,这是第一个问题(请参见评论)。

然后您忘记在内部配置中添加ORM,例如@ORM\UniqueConstraint而不是@UniqueConstraint。此外,UniqueConstraint的配置需要使用名称,而不是属性

您没有提供OtM-MtO关系的两个方面,但我假设它存在。您应该有:

namespace Webkul\CampusConnect\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Table(
 *    name="student_assignment", 
 *    uniqueConstraints={
 *        @ORM\UniqueConstraint(name="assignment_unique", columns={"student_id", "assignment_id"})
 *    }
 * )
 * @Entity
 */
class StudentAssignment
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(name="id", type="integer")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Webkul\CampusConnect\Entity\Student", inversedBy="studentAssignments")
     * @ORM\JoinColumn(name="student_id", onDelete="CASCADE")
     */
    private $student;

    /**
     * @ORM\ManyToOne(targetEntity="Webkul\CampusConnect\Entity\Assignment", inversedBy="studentAssignments")
     * @ORM\JoinColumn(name="assignment_id", onDelete="CASCADE")
     */
    private $assignment;

    // ...
}

2

使用属性的Symfony ≥5.2(和Doctrine ORM ≥2.9)解决方案:

<?php
// ...

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; // optional, see below

//  ...

#[ORM\UniqueConstraint(name: 'foo_bar', columns: ['foo', 'bar', 'user_id'])] // notice the "_id" suffix in the relation column
#[UniqueEntity(['foo', 'bar', 'user'])] // optional Symfony-level constraint: https://symfony.com/doc/current/reference/constraints/UniqueEntity.html
class FoobarEntity
{
    #[ORM\Column(type: 'string')]
    private string $foo;

    #[ORM\Column(type: 'string')]
    private string $bar;

    // relation example
    #[ORM\ManyToOne(inversedBy: 'userFoobars')]
    #[ORM\JoinColumn(nullable: false)]
    private ?User $user = null;
 
    // ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接