无法存储带有问题的标签:给定字符串
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
]);
【讨论】:
以上是关于无法存储带有问题的标签:给定字符串的主要内容,如果未能解决你的问题,请参考以下文章