Laravel使用with预加载翻译表按当前locale筛选数据报错如何解决
错误原因
你触发报错的核心是with()方法的传参格式不符合要求:当需要为指定关联添加查询约束时,必须将「关联名+闭包约束」以键值对数组的形式传入,不能分开作为两个独立参数传入。
你原来的写法里with()把第二个参数的闭包当成了要加载的关联名,Laravel内部处理关联名字符串时拿到了闭包类型,就触发了mb_strpos参数类型错误。
修复代码
直接修改预加载的传参结构即可:
$posts = Post::with(['translations' => function($q) { $q->where('translate_code', app()->getLocale()); }])->get();
如果是Laravel 9及以上版本,还可以用箭头函数简化写法:
$posts = Post::with(['translations' => fn($q) => $q->where('translate_code', app()->getLocale())])->get();
进阶优化方案
你可以直接在Post模型中新增一个当前语言翻译的专属关联,后续查询不用重复写约束逻辑:
// app/Models/Post.php public function currentTranslation() { // 关联类请替换为你自己的翻译表对应模型 return $this->hasOne(Translation::class) ->where('translate_code', app()->getLocale()); }
之后查询直接调用该关联即可:
$posts = Post::with('currentTranslation')->get();
内容的提问来源于stack exchange,提问作者mafortis
相关产品推荐
相关产品推荐

