Laravel使用rtconner/laravel-tagging更新标签报tag()调用int类型错误
报错根因
你遇到的Call to a member function tag() on int错误,核心原因是Eloquent查询构造器的update()方法返回值是受影响的行数(整数类型),并非模型实例,对整数调用tag()方法必然触发报错。
另外存在一处逻辑问题:更新场景下直接调用tag()是追加标签,不会清除旧的关联标签,会导致历史标签残留。
前置检查
首先确认你的News模型已经正确引入Taggable trait,这是使用rtconner/laravel-tagging的必要前提:
<?php namespace App\Models; use Conner\Tagging\Taggable; use Illuminate\Database\Eloquent\Model; class News extends Model { use Taggable; // 必须引入该trait // 其余模型代码... }
修正后的代码实现
1. Repository层修正
核心逻辑调整为:先查询出对应ID的模型实例 → 执行普通字段更新 → 用retag()方法替换旧标签(适配更新场景),禁止直接拿update返回值调用标签方法。
public function updateNews($id, $data) { // 先查询对应模型实例,不要直接调用update取返回值 $model = $this->model->findOrFail($id); // 处理标签:拆分后去除前后空格、过滤空值,避免多余逗号生成无效空标签 $tags = array_filter(array_map('trim', explode(',', $data['tags']))); unset($data['tags']); // 更新模型普通字段 $model->update($data); // 更新场景用retag替换全部旧标签,传入空数组时会清除所有关联标签 // 若业务需求为追加标签而非全量替换,再替换为tag()方法 $model->retag($tags); return $model; }
2. 其余层注意点
- Controller层现有缩略图处理、参数验证逻辑可正常运行,无需调整,如果后续需要使用更新后的完整模型数据,接收Repository返回的模型实例即可。
- Blade模板中给tagsinput组件赋值的
$arrTags,建议传入视图前调用模型自带的tagNames()方法拼接为逗号分隔字符串,避免格式不兼容:// 控制器传参示例 $news = News::findOrFail($id); $arrTags = implode(',', $news->tagNames()); return view('news.edit', compact('news', 'arrTags'));
扩展:常用标签操作方法
- 追加标签(保留旧标签):
$model->tag(['标签1', '标签2']); - 全量替换标签(更新场景首选):
$model->retag(['新标签1', '新标签2']); - 移除指定标签:
$model->untag(['待删除标签名']); - 清除所有关联标签:
$model->retag([]); - 获取已绑定标签名数组:
$model->tagNames();
内容的提问来源于stack exchange,提问作者Marc Jamal
相关产品推荐
相关产品推荐

