Php 使用Symfony和doctor检查数据库中是否已存在实体
这是我的情况。我有三个表,Php 使用Symfony和doctor检查数据库中是否已存在实体,php,symfony,doctrine-orm,many-to-many,Php,Symfony,Doctrine Orm,Many To Many,这是我的情况。我有三个表,tag、product和tag\u product,它们是根据tag和product之间的“多对多”关系的注释创建的,也就是说,tag可以与许多产品关联,并且一个产品可以有许多与其关联的标签 现在,我使用数据转换器将标记对象转换为一个字符串,该字符串由用户想要编辑产品时用逗号分隔的标记组成 在标记实体中,我有一个主键、一个id和一个唯一字段,即标记的名称。我基本上不想有两个同名的标签 我的问题是,当提交表单以更新产品时,我不知道如何访问用户选择的“新”标记。有办法吗?访
tag
、product
和tag\u product
,它们是根据tag
和product
之间的“多对多”关系的注释创建的,也就是说,tag
可以与许多产品关联,并且一个产品可以有许多与其关联的标签
现在,我使用数据转换器将标记
对象转换为一个字符串,该字符串由用户想要编辑产品时用逗号分隔的标记组成
在标记
实体中,我有一个主键、一个id和一个唯一字段,即标记的名称。我基本上不想有两个同名的标签
我的问题是,当提交表单以更新产品时,我不知道如何访问用户选择的“新”标记。有办法吗?访问请求可能仅对访问标记的输入字符串有用,而对从数据转换器中的该字符串创建的标记
对象无效
我还可以将当前的$product
对象传递给buildForm
,这将传递给上面提到的数据转换器,但这似乎不是一个好的解决方案,当一个对象被传递时(至少对我来说)。此外,我还需要从数据转换器创建另一个实体管理器,并执行数据转换器不应执行的操作
还有更好的主意吗
编辑
我刚刚想,也许我可以在产品的ArrayCollection
中插入标签时检查该ArrayCollection
是否已经包含与被插入标签同名的标签,但由于我不知道该集合是否已经填充了当前标签,那一刻
编辑2
我想,上一次编辑中的解决方案对我也不起作用,因为插入新标记时,该数组集合是空的…不确定这是否是最佳做法,但我过去所做的是使用以下
ModelTransformer
// ArrayCollection of tags to string
function ($tags)
{
if ($tags === null)
return '';
return implode(',', array_map(function($tag){
return $tag->getName();
}, $tags->toArray()));
}
// string to ArrayCollection of tags
function ($string)
{
$tags = new \Doctrine\Common\Collections\ArrayCollection();
if ($string === '' || $string === null)
return $tags;
$array = explode(',', $string);
foreach ($array as $tagName) {
$tag = $this->em
->getRepository('AppBundle:Tag')
->findOrCreateByName($tagName);
$tags->add($tag);
}
return $tags;
}
其中键实际上是TagRepository
public function findOrCreateByName($name)
{
$name = trim($name);
$tag = self::findOneBy(['name' => $name]);
if ($tag === null) {
$tag = new Tag;
$tag->setName($name);
}
return $tag;
}
这和我检查变压器的想法很相似。。。最后,如果我没有在控制器中找到解决方案,我想,我应该这样做,我会选择这个选项。。。如果我能够在提交表单的所有转换之后以某种方式访问数据,那么我可以在控制器中进行访问…我认为控制器不适合这样做。模型应该是不可知的,这意味着不知道/不关心它们是否已经存在,这显然是模型/存储库的一部分。是的,但使用存储库或不使用存储库访问和修改数据库数据的工作通常在控制器中完成(显式或不显式,即通过调用服务来完成)…是的。很高兴听到您找到另一种/更清洁的解决方案