【问题标题】:how to retrieve nested polymorphic relationship如何检索嵌套的多态关系
【发布时间】:2020-09-12 14:10:20
【问题描述】:

在多语言应用程序中,我的应用程序中有这些具有多态关系的模型:

  • 发布
  • 类别
  • 标签
  • 翻译

它们之间的这些关系:

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

【问题讨论】:

    标签: laravel many-to-many polymorphic-relationship


    【解决方案1】:

    这个呢:

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

    【讨论】:

    • 谢谢。我想避免另一个循环显示类别列表。我已经编辑了我的问题并解释了更多。如果您再看一下这个问题,我将不胜感激
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多