首页 > 解决方案 > 如何为 Laravel 中的多语言帖子分配多语言类别

问题描述

我正在开发一个博客项目,其中管理员可以添加两种或多种语言的帖子,并且这些帖子包含在管理员也可以添加两种或多种语言的类别中(多语言网站)。

所以我的数据库类似于:类别表:id | translation_lang | trnaslation_of | name | slug | created_at | upadated_at

帖子表:id | translation_lang | trnaslation_of |title | body | created_at | updated_at

post_category:id | post_id | category_id

帖子和类别之间的关系是多对多的。岗位型号:

  public function categories(){
        return $this->belongsToMany(Category::class, 'post_category');
    }

    //accessing posts translations

    public function posts(){
        return $this->hasMany(self::class,'translation_of');
    }

类别型号:

      public function posts(){
        return $this->belongsToMany(Post::class, 'post_category');
    }

    //accessing categories translations


    public function categories(){
        return $this->hasMany(self::class,'translation_of');
    }

以及在 PostsController 中添加新帖子的方法:

 $posts = collect($request->post);

        $filter = $posts->filter(function($value, $key){

            //get_defalult_lang() is custom helper method to get app default language

            return $value['abbr'] == get_default_lang();

        });

        $default_post = array_values($filter->all()) [0];

        DB::beginTransaction();

        $default_post_id = Post::insertGetId([

            'translation_lang'=> $default_post['translation_lang'],
            'translation_of' => 0,
            'title' => $default_post['title'],
            'slug' =>str_replace(' ', '_', $default_post['title'] ),
            'body'=>$default_post['body'],
            'user_id'=>Auth::user()->id,

        ]);


        $post = Post::find($default_post_id);

        $post->categories()->syncWithoutDetaching($request->categoriesIds);


        $posts_in_other_langs = $posts->filter(function($value, $key){

            return $value['abbr'] != get_default_lang();

        });

        if (isset($posts_in_other_langs) && $posts_in_other_langs->count()) {

            $posts_arr = [];

            foreach($posts_in_other_langs as $post_in_other_lang) {


                $posts_arr[] = [

                    'translation_lang'=> $post_in_other_lang['translation_lang'],
                    'translation_of' => $default_post_id,
                    'title' => $post_in_other_lang['title'],
                    'slug' =>str_replace(' ', '_', $post_in_other_lang['title'] ),
                    'body'=>$post_in_other_lang['''],
                    'user_id'=>Auth::user()->id,

                ];

            }

             Post::Insert($posts_arr);

        }

        DB::commit();

现在的问题是,当我添加新帖子时,laravel 只会将默认语言类别分配给默认语言帖子,并且不会为翻译分配任何内容,这意味着当用户切换网站语言时,他/她将不会在帖子上获得任何类别因为它们不是从第一手开始分配给其他语言的帖子(翻译),而实际需要的是根据transltion_lang, 和transltion_of表将每个帖子的翻译分配给每个类别的翻译。

我希望我能很好地实现我的想法,也希望能找到帮助。

标签: laravel

解决方案


推荐阅读