如何解决如何将标签存储到自定义实体?
/**
* @ORM\ManyToMany(targetEntity="Sulu\Bundle\TagBundle\Tag\TagInterface")
* @ORM\JoinTable(name="venue_tags",* joinColumns={@ORM\JoinColumn(name="venue_id",referencedColumnName="id")},* inverseJoinColumns={@ORM\JoinColumn(name="idTags",referencedColumnName="id")}
* )
*/
private $tags;
然后我有这样的设置器(实际上是加法器):
public function addTag(TagInterface $tag)
{
$this->tags[] = $tag;
return $this;
}
将字段添加到表单详细信息 XML 中,例如:
<property name="tags" type="tag_selection">
<Meta>
<title lang="de">Tags</title>
<title lang="en">Tags</title>
</Meta>
<tag name="sulu.search.field" type="tags"/>
</property>
protected function mapDataToEntity(array $data,Venue $entity): void
{
....
foreach ($data['tags'] as $tag) {
$entity->addTag($tag);
}
....
但是作为 $data['tags']
我在这里收到字符串数组,我的 addTag()
需要 TagInterface
对象的实例。如何从我拥有的字符串创建该对象,通常这是存储标签的正确方法。
更新:
/**
* @var TagManagerInterface
*/
private $tagManager;
和构造函数如:
public function __construct(
ViewHandlerInterface $viewHandler,...
TagManagerInterface $tagManager
) {
$this->viewHandler = $viewHandler;
...
$this->tagManager = $tagManager;
parent::__construct($viewHandler);
}
$tagEntities = $this->tagManager->resolveTagNames($data['tags']);
foreach ($tagEntities as $tagEntity) {
$entity->addTag($tagEntity);
}
但后来我得到错误:
传递给 App\Entity\Venue::addTag() 的参数 1 必须实现接口 Sulu\Bundle\TagBundle\Tag\TagInterface,int 给定,在 /var/www/html/src/ 中调用第 147 行的 Controller/Admin/VenueController.PHP
我做错了什么?就像我得到标签 ID 一样?我应该以某种方式加载标签吗?
更新 2:
添加 findById()
保存标签后有效。但是,现在我又发现了 2 个问题:
-
在标签字段中不再显示标签后,即使关系也能很好地保存在数据库中。此外,如果我转到概览页面并返回编辑实体,则不会重新填充所选(已保存)标签。我还必须添加什么才能实际使用数据库中保存的标签?
-
如果我先选择“Tag1”并单击“保存”,它就会保存得很好。但是,如果我再次编辑实体并再次选择“Tag1”,Sulu 尝试使用相同的键创建新行,但我收到错误消息:“sqlSTATE[23000]: 完整性约束违规:1062 Duplicate entry '4-1 ' 用于键 'venue_tags.PRIMARY'"。我想应该先删除以前保存的密钥,但最佳方式是如何以及在哪里?
解决方法
您可以使用 TagManager 服务(id:sulu_tag.tag_manager
或 Sulu\Bundle\TagBundle\Tag\TagManagerInterface
):
$tagIds = $tagManager->resolveTagNames($data['tags']);
foreach ($tagIds as $tagId) {
$entity->addTag($tagManager->findById($tagId));
}
,
为了记录,我在实体中添加了新方法:
public function removeAllTags()
{
foreach ($this->getTags() as $tag) {
$this->removeTag($tag);
}
}
我在添加新标签之前从 mapDataToEntity() 调用:
$tagEntities = $this->tagManager->resolveTagNames($data['tags']);
$entity->removeAllTags();
foreach ($tagEntities as $tagEntity) {
$entity->addTag($this->tagManager->findById($tagEntity));
}
这解决了双键问题,但也解决了标签删除的潜在问题。
,将以下代码添加到您的类中,以解决您的第一个问题
data
1
2
4
6
7
# in pandas
df['diff_data'] = df.data.diff()
data diff_data
1 NaN
2 1
4 2
6 2
7 1
要修复第二个,你必须让 addTag 方法知道你不能有多个关系到同一个标签(检查标签是否已经在那里的集合中)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。