Laravel9中Astrotomic Translatable关联表字段翻译问题求助
解决Laravel 9中Astrotomic/laravel-translatable关联表(Pivot)字段翻译失效问题
针对你遇到的Pivot模型调用translate()返回null、翻译不生效的问题,按以下步骤排查修复:
1. 显式指定Pivot模型的翻译关联
在AttributeOffer模型中添加$translationModel属性,确保包能正确识别对应的翻译模型:
class AttributeOffer extends Pivot implements TranslatableContract { use Translatable; public $incrementing = true; // 显式指定翻译模型 protected $translationModel = AttributeOfferTranslation::class; public array $translatedAttributes = [ 'content', ]; protected $fillable = [ 'attribute_id', 'offer_id', ]; }
2. 获取Pivot时预加载翻译关系
当前通过->first()->pivot获取的Pivot对象未加载翻译关联,导致translate()找不到数据返回null。修改查询逻辑,预加载Pivot的翻译:
private function updateAttributeValues($offer, $attributes) { foreach ($attributes as $slug => $values) { // 预加载pivot的translations关联 $attribute = $offer->attributes()->whereSlug($slug)->with('pivot.translations')->first(); if (!$attribute) continue; $pivot = $attribute->pivot; foreach ($values as $locale => $value) { // 使用translateOrNew,不存在则创建新翻译记录 $pivot->translateOrNew($locale)->content = $value; } // 保存Pivot及关联的翻译数据 $pivot->save(); } }
3. 检查数据库表结构
确保attribute_offer_translations表结构正确,需包含以下字段:
id(主键,自增)attribute_offer_id(外键,关联attribute_offer.id)locale(字符串类型,如varchar(5),存储语言标识)content(存储翻译内容的字段)
同时建议给attribute_offer_id和locale添加联合唯一索引,避免重复翻译记录。
4. 验证翻译读取逻辑
如果手动添加数据库翻译数据后仍无法显示,确保读取时指定正确的语言,或使用getTranslation()方法:
// 读取指定语言的翻译 $content = $pivot->getTranslation('content', 'en'); // 或使用当前应用语言 $content = $pivot->content;
内容的提问来源于stack exchange,提问作者clover
相关产品推荐
相关产品推荐

