[英]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_translations : id,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
])
它将创建您的帖子并为其添加翻译
好的,现在开始(请注意,这不是唯一的方法):
安装spatie / laravel-translateable与
作曲家需要spatie / laravel-translateable
**注意:对于本地Spatie / laravel-translateable,请转到版本2 **
创建具有以下结构的表:
创建表articles
( id
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 ;
注意:最好使用迁移。 我刚刚导出了之前测试过的表
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');
现在创建刀片以进行编辑,更新,创建节目等。要获得语言,请在刀片中执行以下操作:
{{$ data-> title}}
{! nl2br($ data-> content)!!}
并在控制器中:添加如下内容:
/ ** *按语言生成字段* * @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();
}
在构造中,我添加了以下内容:
$this->getTranslatableFields($fields)
$ fields是我需要的字段列表
所有方法都应适合您的html格式。 正如我说的,我将背包用于laravel,字段的格式也相应
模型:
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软件包版本 :
在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)
}
保存一个新条目并使用它:
$ 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”
数据库表格式如第一版中所述
如果仍无法解决,请通知我,我将看您的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.