我如何使用教义来创建独特的关系?

Posted

技术标签:

【中文标题】我如何使用教义来创建独特的关系?【英文标题】:How can I use doctrine to create unique relation? 【发布时间】:2020-01-14 09:33:20 【问题描述】:

我有 3 张桌子:

table 'user'
 - id
 - name

table 'task'
 - id
 - name

table 'report'
 - id
 - comment

我需要在表“task”、“report”和“user”之间创建关系,该报告有一个唯一字段“user_id”和“task_id”,但该“report”将包含许多用户和任务。

如何通过Doctrine实现?

【问题讨论】:

查看学说的关联映射。 doctrine-project.org/projects/doctrine-orm/en/2.6/reference/… 【参考方案1】:

一定是这样的:

用户->报告 OneToMany 任务->报告 OneToMany 报告->用户多对一 报告->多对一任务 带有 ID、用户、任务字段的报告中的 UniqueConstraint

关系:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/association-mapping.html#one-to-many-bidirectional

对于 UniqueConstraint:https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/annotations-reference.html#uniqueconstraint

我没有测试代码...

/**
 * @Doctrine\ORM\Mapping\Entity()
 * @Doctrine\ORM\Mapping\Table(name="user")
 */
class User

    /**
     * @Doctrine\ORM\Mapping\Id
     * @Doctrine\ORM\Mapping\Column(type="integer")
     * @Doctrine\ORM\Mapping\GeneratedValue
     */
    protected $id;

    /**
     * @Doctrine\ORM\Mapping\Column(type="text")
     */
    protected $name;

    /**
     * @Doctrine\ORM\Mapping\OneToMany(targetEntity="Report", mappedBy="user")
     */
    protected $reports;

    public function __construct() 
        $this->reports = new \Doctrine\Common\Collections\ArrayCollection();
    

    // addReport, removeReport, Getters and setters


/**
 * @Doctrine\ORM\Mapping\Entity()
 * @Doctrine\ORM\Mapping\Table(name="task")
 */
class Task

    /**
     * @Doctrine\ORM\Mapping\Id
     * @Doctrine\ORM\Mapping\Column(type="integer")
     * @Doctrine\ORM\Mapping\GeneratedValue
     */
    protected $id;

    /**
     * @Doctrine\ORM\Mapping\Column(type="text")
     */
    protected $name;

    /**
     * @Doctrine\ORM\Mapping\OneToMany(targetEntity="Report", mappedBy="task")
     */
    protected $reports;

    public function __construct() 
        $this->reports = new \Doctrine\Common\Collections\ArrayCollection();
    

    // addReport, removeReport, Getters and setters


/**
 * @Doctrine\ORM\Mapping\Entity()
 * @Doctrine\ORM\Mapping\Table(name="report",uniqueConstraints=
 *     @Doctrine\ORM\Mapping\UniqueConstraint(name="report_user_task_idx", columns="id", "user", "task")
 * )
 */
class Report

    /**
     * @Doctrine\ORM\Mapping\Id
     * @Doctrine\ORM\Mapping\Column(type="integer")
     * @Doctrine\ORM\Mapping\GeneratedValue
     */
    protected $id;

    /**
     * @Doctrine\ORM\Mapping\Column(type="text")
     */
    protected $comment;

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="reports")
     */
    protected $user;

    /**
     * @ORM\ManyToOne(targetEntity="Task", inversedBy="reports")
     */
    protected $task;

    // Getters and setters

【讨论】:

以上是关于我如何使用教义来创建独特的关系?的主要内容,如果未能解决你的问题,请参考以下文章

教义没有在教义上创建一对多关系:模式:更新

教义记录应该做多少?

教义 - 如何保持多对一同步?

教义存储库与私人成员

如何使用教义/symfony4 从数据库中获取(连接)两条记录

带有额外字段的教义关系 MtM