【发布时间】:2026-01-29 06:35:01
【问题描述】:
我正在处理一个挑战,我想创建一个多态模型本地化。这将包括长文本列,如 default、en_us、de_de、...
现在想象另一个模型产品。产品通常具有文本属性,如名称、描述、... 下面是我可以使用 Localizations 的多态关系的部分。 localizations 表应该具有这种类型的结构:
| id | localizable_id | localizable_type | default | en_us | de_de |
|---|---|---|---|---|---|
| 1 | 25 | App\Model\Product | Phone | null | Telefon |
| 2 | 25 | App\Model\Product | The best phone on the market without an audio jack | null | Das beste Telefon auf dem Markt ohne Audioanschluss |
| 3 | 15 | App\Model\Article | Top 10 products | null | Top 10 Produkte |
| 4 | 15 | App\Model\Job | Salesman | null | Verkäufer |
如果我希望 Product 具有可本地化的名称和描述,那么根据 Laravel 文档,您应该期望在我的代码中出现这样的内容:
class Product extends Model
{
public function name() // Expecting model with default attribute 'Phone'
{
return $this->morphOne(Localization::class,'localizable');
}
public function description() // Expecting model with default attribute 'The best phone on the market without an audio jack'
{
return $this->morphOne(Localization::class,'localizable');
}
}
无论多么明显,它都无法正常工作,因为我不能指望两个相同的方法返回不同的值。
另一方面,如果我想遵循 Laravel 的约定,Localization 模型应该是这样的:
class Localizable extends Model
{
public function localizable()
{
return $this->morphTo(__FUNCTION__,'localizable_type','localizable_id');
}
}
正如您在上面的示例中看到的,多态关系与我所需要的相反。问题是我想要一张包含所有字符串的表,这些字符串可能会被翻译(localizables)并在许多其他模型中使用它们,而不仅仅是 Product,例如 商店、工作、文章、...
我需要以某种方式实现区分 localizable_types 以及它应该与哪个列/属性相关。实现这一目标的最佳方法是什么?
【问题讨论】:
-
为什么不使用 Laravel 内置的本地化支持?如果您希望能够通过 Web 界面编辑翻译文件,可以使用这样的软件包。 github.com/barryvdh/laravel-translation-manager
-
@miken32 首先我需要能够为翻译机构创建特定的包(通过 laravel 的本地化是不可能的)。其次,我需要将应用本地化与数据本地化分开。第三,它一般不能回答问题 - 另一个示例可能适用于图像,其中一个用户可以拥有个人资料图像和背景图像(具有用于例如文章的多态图像)
-
不会简单地将另一列添加到具有类型(名称、描述等)的表中吗?然后根据它过滤关系?
-
@miken32 我想到了可以用于检索现有记录的列本地化.localizable_context,但我必须以某种方式修改本地化的 save() 方法来添加这个关系名称。而且我不知道如何从 save 方法访问这些信息
标签: php laravel polymorphism relation