我有以下实体:
class File{
private $fileId;
private $filePath;
}
class User{
private $userId;
private array $userFiles;
}
class Order{
private $orderId;
private array $orderFiles;
}
我有三个实体:File
,User
,Order
。现在,我想将User
与File
链接为one2many关系。一个用户可以有多个文件。与Order
一样-通过one2many关系将Order
与File
连接--一个订单可以有多个文件。
我的问题是,是否需要为User
实体创建两个表(一个用于与Order
的关系,一个用于与Order
的关系)?
或者我可以将这两个表合并为一个,例如,在File
实体中添加字段File
,这将告诉我们它属于哪个实体(User
/File
)。
这里有我在xml中的不完整映射
<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>
我更喜欢第二种选择--如果可能的话,一张桌子上的所有东西。
提前感谢!
发布于 2021-12-23 16:10:31
我认为最好的选择是有两个单独的表,如order_files/user_files,而不是将所有内容都硬放在一个表中,并在类似类型(String)的东西上进行中继,以获得集合后的单词。现在,这似乎是非常简单的表(我指的是文件),但随着时间的推移,它可以开发得更多,您可能需要不同的字段来处理这两种不同的文件类型。因此,如果选择此选项,可以将表b/n构建为(例如,Order/orderFiles):
..。
/**
* @var Collection|OrderFiles[]
* @ORM\OneToMany(targetEntity="PathToMyEntity\OrderFile", mappedBy="order")
*/
protected $orderFiles;
函数,您需要在这个集合中添加移除项,如下所示:.
/**
* @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类上管理这个关系:
/**
* @ORM\ManyToOne(targetEntity="PathToMyEntity\Order", inversedBy="orderFiles")
* @ORM\JoinColumn(name="order_id", referencedColumnName="id", nullable=false)
*/
protected $order;
以及get set方法:
/**
* 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;
}
这只是一个建议,但如果一些理论大师也对此发表意见,那就太好了:)
https://stackoverflow.com/questions/70463373
复制相似问题