koenhoeijmakers / laravel-translatable
Requires
- php: >=7.2.5
- laravel/framework: ^7.4
Requires (Dev)
- mockery/mockery: ^1.3.1
- orchestra/testbench: ^5.0
- phpunit/phpunit: ^8.5
README
处理模型翻译的新鲜方式,翻译将直接集成到模型中,而不是让您查询关系或逐个获取每个属性的翻译。
安装
需要此包。
composer require koenhoeijmakers/laravel-translatable
...并且可选地发布配置。
php artisan vendor:publish --provider="KoenHoeijmakers\LaravelTranslatable\TranslatableServiceProvider"
使用
设置可翻译模型。
首先创建一个迁移和一个模型,我们将使用Animal
模型和相应的AnimalTranslation
模型。
迁移
Schema::create('animals', function (Blueprint $table) { $table->increments('id'); $table->timestamps(); });
始终有一个locale
和一个指向原始模型的foreign_key
,在我们的例子中是animal_id
。
Schema::create('animal_translations', function (Blueprint $table) { $table->increments('id'); $table->unsignedInteger('animal_id'); $table->string('locale'); $table->string('name'); $table->timestamps(); $table->unique(['locale', 'animal_id']); $table->foreign('animal_id')->references('id')->on('animals'); });
模型
在模型上注册特性,并将应翻译的列添加到$translatable
属性中,**但也要使它们可填充**,因为保存是通过事件处理的,这样我们就不必更改save
方法,使包更具互操作性。
所以请确保
$translatable
列在两个模型中也是$fillable
。
use Illuminate\Database\Eloquent\Model; use KoenHoeijmakers\LaravelTranslatable\HasTranslations; class Animal extends Model { use HasTranslations; protected $translatable = ['name']; protected $fillable = ['name']; }
use Illuminate\Database\Eloquent\Model; class AnimalTranslation extends Model { protected $fillable = ['name']; }
这就是全部内容,但您可以在下面了解更多关于包的信息。
关于
使此包如此特殊的是它处理翻译的方式,如何检索、存储和查询它们。
查询
由于此包处理翻译的方式,查询变得非常简单,而对于其他包,您会有一个->whereTranslation('nl', 'column', '=', 'foo')
方法。
但在此包中,您只需执行->where('column', '=', 'foo')
,它就会知道如何查询,就像您过去一样查询!
检索
当您从数据库检索模型时,包会将翻译表与当前区域设置config/app.php
中的翻译连接起来。
这使得任何翻译列都像模型本身的“本地”列一样,由于这一点,我们不需要在模型上覆盖许多方法,这是一个很大的优点。
需要用不同的语言获取模型?调用$model->translate('nl')
即可完成。现在您想保存nl
翻译?只需调用->update()
。模型知道它在哪个区域加载,并且会相应地处理。
$animal = Animal::query()->find(1); $animal->translate('nl')->update(['name' => 'Aap']);
存储
您将像在模型上设置属性一样存储您的翻译,所以这将非常出色
Animal::query()->create(['name' => 'Monkey']);
但我听说您想在一个请求中存储多个翻译!在这种情况下,您可以使用->storeTranslation()
或->storeTranslations()
方法。
$animal = Animal::query()->create(['name' => 'Monkey']); $animal->storeTranslation('nl', [ 'name' => 'Aap', ]); $animal->storeTranslations([ 'nl' => [ 'name' => 'Aap', ], 'de' => [ 'name' => 'Affe', ], ]);