You need to enable JavaScript to run this app. Laravel使用with预加载翻译表按当前locale筛选数据报错如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 14:06:02