首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一个实体在许多,多对一的关系中使用。

一个实体在许多,多对一的关系中使用。
EN

Stack Overflow用户
提问于 2021-12-23 14:20:05
回答 1查看 69关注 0票数 2

我有以下实体:

代码语言:javascript
运行
复制
class File{
    private $fileId;
    
    private $filePath;
}

class User{
    private $userId;

    private array $userFiles;
}

class Order{
    private $orderId;
    
    private array $orderFiles;
}

我有三个实体:FileUserOrder。现在,我想将UserFile链接为one2many关系。一个用户可以有多个文件。与Order一样-通过one2many关系将OrderFile连接--一个订单可以有多个文件。

我的问题是,是否需要为User实体创建两个表(一个用于与Order的关系,一个用于与Order的关系)?

或者我可以将这两个表合并为一个,例如,在File实体中添加字段File,这将告诉我们它属于哪个实体(User/File)。

这里有我在xml中的不完整映射

代码语言:javascript
运行
复制
<entity name="File" table="file">
    <id name="fileId" type="uuid">
        <generator strategy="NONE" />
    </id>
    <field name="filePath />
</entity>

<entity name="User" table="user">
    <id name="userId" type="uuid">
        <generator strategy="NONE" />
    </id>
    <one-to-many field="userFiles" target-entity="File" mapped-by="herewhat?" >
        <cascade>
            <cascade-persist />
        </cascade>
    </one-to-many>
</entity>

<entity name="Order" table="order">
    <id name="orderId" type="uuid">
        <generator strategy="NONE" />
    </id>
    <one-to-many field="orderFiles" target-entity="File" mapped-by="herewhat?" >
        <cascade>
            <cascade-persist />
        </cascade>
    </one-to-many>
</entity>

我更喜欢第二种选择--如果可能的话,一张桌子上的所有东西。

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2021-12-23 16:10:31

我认为最好的选择是有两个单独的表,如order_files/user_files,而不是将所有内容都硬放在一个表中,并在类似类型(String)的东西上进行中继,以获得集合后的单词。现在,这似乎是非常简单的表(我指的是文件),但随着时间的推移,它可以开发得更多,您可能需要不同的字段来处理这两种不同的文件类型。因此,如果选择此选项,可以将表b/n构建为(例如,Order/orderFiles):

..。

代码语言:javascript
运行
复制
/**
 * @var Collection|OrderFiles[]
 * @ORM\OneToMany(targetEntity="PathToMyEntity\OrderFile", mappedBy="order")
 */
protected $orderFiles;

函数,您需要在这个集合中添加移除项,如下所示:.

代码语言:javascript
运行
复制
/**
 * @param $orderFiles
 *
 * @return $this
 */
public function addOrderFiles($orderFiles)
{
    $this->orderFiles = $orderFiles;

    return $this;
}

/**
 * @param $orderFiles
 *
 * @return $this
 */
public function removeOrderFiles($orderFiles)
{
    foreach ($orderFiles as $orderFile) {
        $this->orderFiles->removeElement($orderFile);
    }

    return $this;
}

/**
 * Add orderFile
 *
 * @param OrderFile $orderFile
 *
 * @return Order
 */
public function addOrderFile(OrderFile $orderFile)
{
    $this->orderFiles[] = $orderFile;

    return $this;
}

/**
 * Remove orderFile
 *
 * @param OrderFile $orderFile
 */
public function removeOrderFile(OrderFile $orderFile)
{
    $this->orderFiles->removeElement($orderFile);
}

/**
 * Get orderFile
 *
 * @return Collection|OrderFile[]
 */
public function getOrderFiles()
{
    return $this->orderFiles;
}

……

现在让我们在file类上管理这个关系:

代码语言:javascript
运行
复制
/**
 * @ORM\ManyToOne(targetEntity="PathToMyEntity\Order", inversedBy="orderFiles")
 * @ORM\JoinColumn(name="order_id", referencedColumnName="id", nullable=false)
 */
protected $order;

以及get set方法:

代码语言:javascript
运行
复制
/**
 * Get order
 *
 * @return Order
 */
public function getOrder()
{
    return $this->order;
}

/**
 * Set order
 *
 * @param Order $order
 *
 * @return self
 */
public function setOrder(Order $order)
{
    $this->order = $order;

    return $this;
}

这只是一个建议,但如果一些理论大师也对此发表意见,那就太好了:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70463373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档