Laravel关联模型中能否传入变量?
Laravel关联模型中能否传入变量?
当然可以!这种多语言内容关联的需求太普遍了,你的思路完全没问题,我来给你说清楚怎么实现和调用~
首先,你在Content模型里定义的这个带参数的关联方法是有效的:
public function language($lang = 1) { return $this->hasOne(AppInitLang::class) ->where('language_id', $lang); }
调用方式很简单:
当你拿到Content的实例后,直接调用这个方法并传入语言ID就行:
// 获取指定内容 $content = Content::find(1); // 获取该内容对应语言ID=2的翻译记录 $translatedContent = $content->language(2);
可以优化默认值更实用:
如果你的应用有默认语言或者当前请求语言,可以把方法的默认参数改成动态获取的,不用每次手动传值:
public function language($lang = null) { // 优先用传入的参数,没有的话用当前应用的语言标识(如果你的language_id和locale对应,需要自己转换) $lang = $lang ?? app()->getLocale(); // 假设你有个转换逻辑,把locale转成对应的language_id // $langId = $this->getLanguageIdFromLocale($lang); return $this->hasOne(AppInitLang::class)->where('language_id', $lang); }
预加载带参数的关联:
如果需要批量获取Content并同时加载对应语言的翻译,可以用闭包预加载:
$lang = 2; $contents = Content::with(['language' => function ($query) use ($lang) { $query->where('language_id', $lang); }])->get(); // 之后遍历的时候直接用 foreach ($contents as $content) { echo $content->language->title; }
小提醒:
这种带参数的关联方法,调用后会直接执行查询返回模型实例;如果需要继续追加查询条件,可以链式调用:
$activeTranslatedContent = $content->language(2)->where('status', 1)->first();
备注:内容来源于stack exchange,提问作者Rafael Schaffer Gimenes
相关产品推荐
相关产品推荐

