无法存储带有问题的标签:给定字符串

Posted

技术标签:

【中文标题】无法存储带有问题的标签:给定字符串【英文标题】:can't store tags with question : string given 【发布时间】:2021-08-13 03:56:21 【问题描述】:

您好,我是 laravel 初学者,有一个带有 laravel 8 的 API

我想在我的项目中存储带有问题的标签,并且问题和标签之间的关系是多对多多态的(因为我有另一个表并且它们也有标签字段)

在我的 QuestionController() 中,当我想存储问题和标签时,出现此错误:

"Argument 1 passed to Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany::save() must be an instance of Illuminate\\Database\\Eloquent\\Model, string given

当我使用save 而不是saveMany() 时会出现此错误:

"message": "Argument 1 passed to Illuminate\\Database\\Eloquent\\Relations\\BelongsToMany::save() must be an instance of Illuminate\\Database\\Eloquent\\Model, array given

我也使用了sync(),但标签没有存储在数据库中

我和邮递员一起尝过

块引用

method 是这样的:

 public function store(StoreQuestionRequest $request)
    
        $validatedData = $request->all();

      ////Because there is no need storage images and question codes

        $question = Question::create($validatedData); //store question

        //store tags
        $tag = new Tag();

        $tags = explode(",", $request->tag);//separate tags

        $tag['tag'] = $tags;

        $question->tags()->saveMany($tags);

        return response()->json([
            'success'=>true,
            'message'=> 'successfully',
            'data'=>$question
        ]);
    

所以如果您需要了解relations,这些是我的模型:

Question

 public function tags()
        return $this->morphToMany(Tag::class, 'taggable');
    

Tag

 public function questions()
        return $this->morphedByMany(Question::class, 'taggable');
    

感谢您的帮助和关注,我真的需要解决这个问题

【问题讨论】:

你确定你不是指$questions->tags()->save($tag)吗?您保存的是数组,而不是您创建的 Tag 实例。 当我尝试$questions->tags()->save($tag) 时出现此错误:"message": Array to string conversion 【参考方案1】:

尝试attach(),但您需要传递标签的ID,而不是标签本身。

如果用户只是在标签之间进行选择,您可以将他选择的标签的 id 与请求中的问题一起发送为数组,然后将其传递给附加方法

$question->tags()->attach($request->tagsIds);

如果用户创建了标签,您可以收集新的 id 并将它们传递给附件,就像这样

 $tags = explode(",", $request->tag);//separate tags
$tagsIds = [];
foreach($tags as $tag)

 array_push($tagsIds,Tag::create(['theTagColumn ex: name'=>$tag])->id);

$question->tags()->attach($tagsIds);

希望这对你有用

【讨论】:

如果Tag 不存在,则save method 是合适的。此外,attach 将接受记录的 ID 或模型实例。 我认为save方法不适用于多对多关系,所以这里使用save是行不通的 Argument 1 passed to Illuminate\\Database\\Eloquent\\Builder::create() must be of the type array, string given 哦,对不起!应该是这样的:Tag::create(['theTagColumn ex: name',=>$tag]) 抱歉回复晚了【参考方案2】:

解决了:

 public function store(StoreQuestionRequest $request)
    
        $validatedData = $request->all();

      ////Because there is no need storage images and question codes

        $question = Question::create($validatedData); //store question

        //store tags

       $tagNames = explode(",", $request->tag);//separate tags

        $tagIds = [];

        foreach($tagNames as $tagName)
        
            $tag = Tag::firstOrCreate(['tag'=>$tagName]);
            if($tag)
            
              $tagIds[] = $tag->id;
            
        
        $question->tags()->sync($tagIds);


        return response()->json([
            'success'=>true,
            'message'=> 'successfully',
            'data'=>$question
        ]);
    

【讨论】:

以上是关于无法存储带有问题的标签:给定字符串的主要内容,如果未能解决你的问题,请参考以下文章

将html标签存储在xml中

在带有多个参数的自定义模板标签的模板中使用“if”

在单元格标签等于给定字符串的collectionView或TableView上选择行/部分?

带有字符串标签的 Spark ALS - 转换回字符串

带有 SKLabelNode 的文本工具包

带有图像标签的 Binging 字符串 - Windows Phone 8.1 UWP