0

嗨,我是 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');
    }

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

4

2 回答 2

0

尝试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);

希望这对你有用

于 2021-05-24T21:20:24.823 回答
0

它解决了:

 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
        ]);
    }

于 2021-05-26T07:52:02.410 回答