如何检查Laravel模型是否包含指定的Spatie Tag?
因为Spatie Tags的标签名称以多语言JSON格式存储(如{"en": "Midtown"}),直接使用集合的contains('Midtown')无法匹配到对应标签,以下是官方推荐的解决方案:
1. 使用内置的hasTag()方法(推荐)
关联了Tags的模型(比如你的User模型)自带hasTag()方法,能自动处理多语言字段的匹配逻辑:
// 适配当前应用语言检查标签 $hasMidtownTag = $user->hasTag('Midtown'); // 指定语言精准匹配 $hasMidtownTag = $user->hasTag(['en' => 'Midtown']);
这个方法还支持多种传入类型,灵活度很高:
// 检查是否包含多个标签中的任意一个 $user->hasTag(['Midtown', 'Downtown']); // 检查是否同时包含所有指定标签 $user->hasAllTags(['Midtown', 'Downtown']); // 传入Tag模型实例或标签ID也可以 $tag = Tag::find(1); $user->hasTag($tag);
2. 手动操作集合的方式
如果需要自定义匹配逻辑,可通过集合的回调方法或JSON字段查询来实现:
// 用contains回调检查指定语言的标签名称 $hasMidtownTag = $user->tags->contains(function ($tag) { return $tag->name['en'] === 'Midtown'; }); // 用where结合isNotEmpty判断 $hasMidtownTag = $user->tags->where('name->en', 'Midtown')->isNotEmpty();
内容的提问来源于stack exchange,提问作者Dylan Glockler
相关产品推荐
相关产品推荐

