You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:45:44