如果表中不存在新的帖子标签,则存储它?

Posted

技术标签:

【中文标题】如果表中不存在新的帖子标签,则存储它?【英文标题】:Storing a new post tag if it doesn't exist in the table? 【发布时间】:2017-12-13 16:41:23 【问题描述】:

我在博客文章表单中有一个输入字段(使用 select2 插件),它允许用户从表中的现有标签中插入文章标签或创建新标签并将它们存储在标签表中,并将它们附加到文章中当他们点击提交帖子按钮时。我设法通过使用array_filter() 过滤输入来完成这项工作,如果输入是!is_numeric,则输入将首先存储在标签表中,然后将id 附加到帖子中。

这个问题是当输入的新标签是全数字类型时它不起作用,比如2017标签。有没有办法让它工作,所以新标签不仅限于字符串,还包括数字类型?如果可能的话,我不想为此使用任何包。

后存储方法:

public function store(PostsReq $request) 
        $input = $request->all();
        $post = Post::create($input);

        //Handle the tags
        $getTags = $request->input('tagspivot');
        $oldTags = array_filter($getTags, 'is_numeric');
        $newTags = array_filter($getTags, function($item) 
            return !is_numeric($item);
        );
        foreach ($newTags as $newTag) 
            if ($tag = Tag::create(['title' => strtolower(trim($newTag))])) 
                $oldTags[] = $tag->id;
            
        
        $post->tags()->attach($oldTags);

        // Upload Image
        if ($request->hasFile('image')) 
            $input['image'] = $this->uploadImage($request, $post);
        
        return redirect()->route('postindex')->with($this->postStoreSuccess);
    

【问题讨论】:

【参考方案1】:

这里有三行代码就绰绰有余了:

    $tag = Tag::firstOrCreate([
        'title' => $request->input('tagspivot'),
    ]);

您无需检查!is_numeric。但是,在您的表单中不要使用标签 ID 作为值。使用标题。

【讨论】:

以上是关于如果表中不存在新的帖子标签,则存储它?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:如果表中不存在则插入记录[重复]

如果右侧表中不存在日期,则使用 LEFT JOIN 返回 NULL

查询输出表中不存在的值

如果其他表中不存在 id,则获取不同的行并使用合并

如果 mysql 数据库中的表中不存在,则更新或插入多条记录

HSQLDB 如果不存在则插入,如果存在则更新