将具有不同语言的2个相同id的post表存储到数据库中

时间:2017-03-31 15:01:39

标签: mysql database laravel multilingual

我正在建立一个多语言网站。在这种情况下,只有2种语言,使用Laravel的印尼语和英语。 我有帖子表,它会存储每个帖子的id,post_translations表是存储本地,标题和帖子的描述。 我在将数据存储到数据库时遇到了问题。我不知道如何在没有身份证的情况下存储帖子,除非我添加了2个印尼语和英语相同的帖子。

这是结果(错误)

发布表

id 
1
2

post_translations表

id  post_id  locale   title
1     1      en       fisrt post
2     2      id       post yang pertama

明显的结果

发布表

id 
1

post_translations表

id  post_id  locale   title
1     1      en       fisrt post
2     1      id       post yang pertama

PostController中

  public function store(Request $request) {
    $this->validate($request, [
        'title' => 'required',
        'slug' => 'required',
        'content' => 'required'
    ]);

    $post = new Post;

    $post->title = $request->title;
    $post->slug = $request->slug;
    $post->content = $request->content;

    $post->save();
    return redirect()->route('post.index');
}

2 个答案:

答案 0 :(得分:0)

我认为你应该改变你的表格结构:

帖子 id,slug

post_translations id,post_id,locale,title,content

还要为Post模型添加关系:

public function translations()
{
    return $this->hasMany(PostTranslation::class, 'post_id');
}

更新您的控制器:

$post = new Post;

$post->slug = $request->slug;
$post->save();

$post->translations()->create([
    'locale' => 'en', //or grab it from $request
    'title' => $request->title,
    'content' => $request->content
])

它会创建你的帖子并为其添加翻译

答案 1 :(得分:0)

好的,我们走了(请注意,这不是唯一的方法):

  1. 使用

    安装spatie / laravel-translatable

    作曲家需要spatie / laravel-translatable

  2. **注意:对于原生的spatie / laravel-translatable,请转到版本2 **

    1. 使用此结构创建一个表:

      CREATE TABLE articles(   id int(10)UNSIGNED NOT NULL,   title text COLLATE utf8_unicode_ci,   slug text COLLATE utf8_unicode_ci,   content text COLLATE utf8_unicode_ci,   created_at时间戳NULL DEFAULT NULL,   updated_at时间戳NULL DEFAULT NULL )ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

    2. 注意:beter使用迁移。我刚刚导出了一个我之前做过的表来测试

      1. 以json格式将数据插入数据库中,如下所示:
      2.     INSERT INTO `pages` (`id`, `title`, `slug`, `content`, `created_at`, `updated_at`) VALUES
                (1, '{"ro":"Acas\\u0103","en":"Home"}', NULL, '{"ro":"<p><strong>Test title<\\/strong><\\/p>\\r\\n\\r\\n<p>Test content romanian<\\/p>\\r\\n","en":"<p><strong>test title english<\\/strong><\\/p>\\r\\n\\r\\n<p>test content english.<\\/p>\\r\\n"}', '2017-04-03 11:45:56', '2017-04-03 12:15:16');

        1. 现在创建刀片以进行编辑,更新,创建节目等。要获得语言,请在刀片中执行以下操作:

          {{$ data-&gt; title}}

          {!! nl2br($ data-&gt; content)!!}

        2. 在控制器中: 添加这样的东西:

          / **          *按语言生成字段          *          * @param Model $条目从数据库中选择的项目          *           * @return数组          * /

          public function getTranslatableFields($fields)
          {
              $inputs = [];
              $languages = $this->getLanguages();
          
              foreach ($languages as $language) {
                  foreach ($fields as $field) {
                      $inputs[] = [
                          'name' => "{$field['name']}[{$language->abbr}]",
                          'label' => $field['label'] . " ($language->abbr)",
                          'lang' => $language->abbr,
                          'type' => array_key_exists('type', $field) ?     $field['type'] : 'text'
                      ];
                  }
              }
          
              return $inputs;
          }
          
        3. 我在LangTrait中添加了这个功能。因为我也用laravel背包做了更多的事情。

          对于编辑,我在特征中添加了这个方法:

          /**
               * Show the form for editing the specified resource.
               *
               * @param   int             $id             the item's identifier
               *
               * @return  Response
               */
              public function edit($id)
              {    
                  $data['entry'] = Model::find($id);
                  $data['title'] = trans('lang_file.edit').' '.$this->entity_name; // name of the page 
                  $data['fields'] = $this->getMultiLangFields($data['entry']);
                  $data['id'] = $id;
          
                  return view('crud::edit', $data);
              }
          
          
          /**
               * Generate the field by language
               *
               * @param   Model        $entry      the item selected from the database
               *
               * @return  array
               */
              protected function getMultiLangFields($entry)
              {
                  $fields['id'] = ['name' => 'id', 'type' => 'hidden', 'value' => $entry->id];
          
                  foreach ($this->crud->update_fields as $key => $field) {
                      $value = null;
          
                      if (array_key_exists('lang', $field)) {
                          $name = preg_replace('/(\[\w{2}\])$/i', '', $field['name']);
                          $value = $entry->getTranslation($name, $field['lang']);
                      }
          
                      $fields[$key] = array_merge($field, ['value' => $value]);
                  }
          
                  return $fields;
              }
          
          
          
          /**
               * Get the application active languages
               *
               * @return  \Backpack\LangFileManager\app\Models\Language
               */
              protected function getLanguages()
              {
                  return Language::whereActive(1)->orderBy('default', 'desc')->get();
              }
          
          1. 最后在我的主控制器中我做了: 使用LangTrait; (包含以上所有内容)
          2. 在构造中我添加了这个:

            $this->getTranslatableFields($fields)
            

            其中$ fields是我需要的字段列表

            所有方法都应该适应你的html格式。正如我所说,我使用背包进行laravel,字段相应地格式化

            1. 最后,为了让getLanguage文件正常工作,我在数据库中创建了一个新表和一个模型:
            2. 型号:

              class Language extends Model
              {
                  protected $table = 'languages';
              
                  protected $fillable = ['name', 'flag', 'abbr', 'native', 'active', 'default'];
              
                  public $timestamps = false;
              
                  public static function getActiveLanguagesArray()
                  {
                      $active_languages = self::where('active', 1)->get()->toArray();
                      $localizable_languages_array = [];
              
                      if (count($active_languages)) {
                          foreach ($active_languages as $key => $lang) {
                              $localizable_languages_array[$lang['abbr']] = $lang;
                          }
              
                          return $localizable_languages_array;
                      }
              
                      return config('laravellocalization.supportedLocales');
                  }
              
                  public static function findByAbbr($abbr = false)
                  {
                      return self::where('abbr', $abbr)->first();
                  }
              }
              

              表:

              CREATE TABLE `languages` (
                `id` int(10) UNSIGNED NOT NULL,
                `name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
                `app_name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
                `flag` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
                `abbr` varchar(3) COLLATE utf8_unicode_ci NOT NULL,
                `script` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
                `native` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,
                `active` tinyint(3) UNSIGNED NOT NULL DEFAULT '1',
                `default` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
                `created_at` timestamp NULL DEFAULT NULL,
                `updated_at` timestamp NULL DEFAULT NULL,
                `deleted_at` timestamp NULL DEFAULT NULL
              ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
              

              表格中的数据:

              INSERT INTO `languages` (`id`, `name`, `app_name`, `flag`, `abbr`, `script`, `native`, `active`, `default`, `created_at`, `updated_at`, `deleted_at`) VALUES
              (1, 'English', 'english', '', 'en', 'Latn', 'English', 1, 0, NULL, NULL, NULL),
              (2, 'Romanian', 'romanian', '', 'ro', 'Latn', 'română', 1, 1, NULL, NULL, NULL);
              

              由于我是通过一个软件包完成的,所以我对代码进行了一些讨论。

              现在,对于spatie / laravel-translatable包版本

              1. 在config / app.php中设置服务提供程序将其添加到providers数组中:

                Spatie \可翻译\ TranslatableServiceProvider ::类,

              2. 在模型文章中添加use HasTranslations;,如下所示:

                use Illuminate\Database\Eloquent\Model;
                use Spatie\Translatable\HasTranslations;
                
                class NewsItem extends Model
                {
                    use HasTranslations;
                
                    public $translatable = ['name']; // list the columns you want to be translatable (will have json format)
                }
                
                1. 保存一个新条目并使用它:

                  $ article = new Article; $ article-&gt; setTranslation('name','en','英文更新名称')          - &gt; setTranslation('name','nl','Naam in netlands');

                  $物品─&GT;保存();

                  $物品─&GT;名称; //如果当前应用程序区域设置为'en',则返回'英文名称' $ article-&gt; getTranslation('name','nl'); //返回'内德兰德的Naam'

                  应用程序() - &GT;的setLocale( 'NL');

                  $物品─&GT;名称; //返回'Nederlands中的Naam'

                2. 示例来自:https://github.com/spatie/laravel-translatable

                3. 数据库表格式如上文第一版所述

                4. 如果不能解决,请告诉我,我会查看您的代码。