как получить вложенные полиморфные отношения

в многоязычном приложении у меня есть эти модели в моем приложении с полиморфными отношениями:

  • Почта
  • Категория
  • Ярлык
  • Перевести

эти отношения между ними:

Post       ->taggable,categorizable,translatable
Category   ->Translatable
Tag        ->Translatable 

это миграции, которые я использую:

        //categories
        $table->bigIncrements('id');
        $table->string('icon')->nullable();
        $table->integer('parent_id')->unsigned()->nullable();
        $table->timestamps();

        //categorizables
        $table->integer('category_id');
        $table->integer('categorizable_id');
        $table->string('categorizable_type');
        $table->primary(['category_id', 'categorizable_id', 'categorizable_type'],'categorizables');

        //tags
        $table->bigIncrements('id');
        $table->timestamps();

        //taggables
        $table->integer('tag_id');
        $table->integer('taggable_id');
        $table->string('taggable_type');
        $table->primary(['tag_id', 'taggable_id', 'taggable_type'],'taggables');

        //translates
        $table->bigIncrements('id');
        $table->string('lang',10);
        $table->string('title',150)->nullable();
        $table->string('name',50)->nullable();
        $table->string('description')->nullable();
        $table->text('content')->nullable();
        $table->timestamps();

        //translatables
        $table->integer('translate_id');
        $table->integer('translatable_id');
        $table->string('translatable_type');
        $table->primary(['translate_id', 'translatable_id', 'translatable_type'],'translatables');

и у меня есть такие черты для определения отношений:

trait Translatable{
    public function translates(){
        return $this->morphToMany(Translate::class,'translatable','translatables','translatable_id','translate_id');
    }
}

Я попытался получить все категории с переводами и передать их в представление:

$categories = Category::with('translates')->get();
return view('categories.index', compact('categories'));

в представлении, основанном на текущей локали, я хочу получить перевод названия категории, и я не знаю, как это сделать? Буду признателен, если вы поможете мне решить эту проблему.

в модели категории я попытался написать такую ​​функцию, чтобы получить текущий перевод:

 public function currentTranslte()
    {
        $locale=app()->getLocale();
        return $this->hasOne(Translate::class,'id')->where('lang',$locale);
    }

но это не работает. ввиду того, что я хочу использовать что-то вроде:

@forelse ($categories as $category)
{{$category->currentTranslate->name}}

 @empty
    <p>
    nothing found
    </p>
@endforelse

person mohammadreza khalifeh    schedule 12.09.2020    source источник


Ответы (1)


Что насчет этого:

$locale = ...

$categories = Category::with(['translates' => function ($query) use ($locale) {
    $query->where('lang', $locale);
}])->get();

return view('categories.index', compact('categories'));

person Kevin Bui    schedule 13.09.2020
comment
Спасибо. Я хочу избежать еще одного цикла для отображения списка категорий. Я отредактировал свой вопрос и объяснил больше. Буду признателен, если еще раз посмотрите на вопрос - person mohammadreza khalifeh; 13.09.2020