php - Hashtags:只创建一种关系
问题描述
我有这个代码
private function hashtags($article){
$htag = '#';
$arr = explode(" ", $article->description);
$arrc = count($arr);
$i = 0;
$arr_id = [];
while($i < $arrc){
if(substr($arr[$i], 0, 1) === $htag ){
$hash = Hashtag::firstOrCreate(
['name' => $this->hashtagName($arr[$i]), 'slug' => str_slug(ltrim($arr[$i], '#'))]
);
$article->hashtags()->attach($hash);
}
$i++;
}
}
hashtagName 是修改主题标签名称的函数,因为我使用 WYSCIWYG 编辑器,有时我在名称列中遇到 html 标签问题。但这并不重要。我尝试解决我的问题,所以我找到了可以使用而不是附加的代码。
if (! $article->hashtags->contains($hash->id)) {
$article->hashtags()->save($hash);
}
但这并不能解决我的问题。如果我存储具有 2 个或更多相同主题标签的文章,它会创建相同数量的关系。如果我在同一篇文章中使用了 3 个主题标签,我将有 3 个关系。呵呵,我能修吗?
解决方案
您实施中的问题是您检查 hTag 的 id。
为什么
因为如果您有两个相同的 hTag 并保存第一个,您将获得 ID1,然后您将附加它,直到这里没有问题。但是,当您保存第二个相同的(一开始不应该这样做)时,您将获得 ID2,其中 ID1 与 ID2 不同,因此此检查$article->hashtags->contains($hash->id)
行将找不到具有相同名称的 hTag。
一个可能的解决方案:
private function hashtags($article){
$htag = '#';
$arr = explode(" ", $article->description);
$arrc = count($arr);
$i = 0;
$arr_id = [];
while($i < $arrc){
$hTagName = $this->hashtagName($arr[$i]);
$exists = Hashtag::whereArticleId($article_id)
->whereName($hTagName)
->exists();
if(substr($arr[$i], 0, 1) === $htag && !$exists ){
$hash = Hashtag::firstOrCreate(
['name' => $hTagName, 'slug' => str_slug(ltrim($arr[$i], '#'))]
);
$article->hashtags()->attach($hash);
}
$i++;
}
}
推荐阅读
- laravel-nova - Laravel Nova Trix 字段调用未定义方法 Laravel/Nova/Fields/Trix::WithFiles()
- python - 解释安德森亲爱的测试 scipy
- service-worker - PWA 离线优先,连接检测策略
- javascript - 如何将标签添加到 JQuery 中的选定文本
- java - ProcessBuilder 和 RunTime.exec 没有运行我的代码
- python - 试图让我的 tweepy 听众每隔一段时间工作一次
- python - 有什么原因要获取仅由浏览器的一次性密码驱动的网络会话
- react-native - 如何将这些数据返回到其他页面反应导航页面?
- javascript - 所有子弹击中球后都会消失?
- select - SQL Server 2014 - 如果列为空,则从另一个表中检索值