簡體   English   中英

用不同的語言將2個相同的帖子表ID存儲到數據庫中

[英]Storing 2 same id of post table with different language into database

我正在建立一個多語言網站。 在這種情況下,只有2種語言,使用Laravel是印度尼西亞語和英語。 我有職位表,它將存儲每個職位的ID,而post_translations表則用於存儲職位的本地,標題和說明。 將數據存儲到數據庫時出現問題。 我不知道如何在沒有公司ID的情況下存儲帖子,除非我用印尼語和英語添加了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');
}

我認為您應該更改表格的結構:

帖子id,slug

post_translationsid,post_id,語言環境,標題,內容

還添加與您的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. 安裝spatie / laravel-translateable與

    作曲家需要spatie / laravel-translateable

**注意:對於本地Spatie / laravel-translateable,請轉到版本2 **

  1. 創建具有以下結構的表:

    創建表articlesid int(10)UNSIGNED NOT NULL, title文本COLLATE utf8_unicode_ci, slug文本COLLATE utf8_unicode_ci, content文本COLLATE utf8_unicode_ci, created_at時間戳NULL DEFAULT NULL, updated_at NULL DEFAULT NULL NULL NULL ;

注意:最好使用遷移。 我剛剛導出了之前測試過的表

  1. 將數據以json格式插入數據庫中,如下所示:

  INSERT INTO `pages` (`id`, `title`, `slug`, `content`, `created_at`, `updated_at`) VALUES (1, '{"ro":"Acas\\\ă","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-> title}}

    {! nl2br($ data-> content)!!}

  2. 並在控制器中:添加如下內容:

    / ** *按語言生成字段* * @param模型$ entry從數據庫中選擇的項* * @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; } 

我在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; (包含以上所有內容)

在構造中,我添加了以下內容:

$this->getTranslatableFields($fields)

$ fields是我需要的字段列表

所有方法都應適合您的html格式。 正如我說的,我將背包用於laravel,字段的格式也相應

  1. 最后,為了使getLanguage文件起作用,我在數據庫中創建了一個新表和一個模型:

模型:

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-translateable軟件包版本

  1. 在config / app.php中設置服務提供者,將其添加到providers數組中:

    Spatie \\可翻譯\\ TranslatableServiceProvider ::類,

在模型Articles中添加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 =新文章; $ article-> setTranslation('name','en','英文更新名稱')-> setTranslation('name','nl','Naam in het Nederlands');

    $物品─)>保存(;

    $物品─>名稱; //假設當前應用語言環境為“ en”,則返回“英文名稱”。$ article-> getTranslation('name','nl'); //返回'Nat in het Nederlands'

    應用程序() - >的setLocale( 'NL');

    $物品─>名稱; //返回“ Nat in het Nederlands”

  2. 來自以下示例: https//github.com/spatie/laravel-translatable

  3. 數據庫表格式如第一版中所述

如果仍無法解決,請通知我,我將看您的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM