将具有不同语言的帖子表的 2 个相同 ID 存储到数据库中

世界

我正在建立一个多语言网站。在这种情况下,只有 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

后控制器

  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');
}
因陀罗

好的,我们开始吧(请注意,这不是唯一的方法):

  1. 安装 spatie/laravel-translatable

    作曲家需要 spatie/laravel 可翻译

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

  1. 创建一个具有以下结构的表:

    CREATE TABLE articles( idint(10) UNSIGNED NOT NULL, titletext COLLATE utf8_unicode_ci, slugtext COLLATE utf8_unicode_ci, contenttext COLLATE utf8_unicode_ci, created_attimestamp NULL DEFAULT NULL, updated_attimestamp NULL DEFAULT NULL ) ENGINE=InnoDB DEFAULT COLLSETunicodeutf;

注意:最好使用迁移。我刚刚导出了一个我之前做的表来测试

  1. 将数据以json格式插入数据库中,如下所示:

    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->title }}

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

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

    /** * 按语言生成字段 * * @param Model $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-translatable 包版本

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

    Space\Translatable\TranslatableServiceProvider::class,

在模型文章中添加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');

    $article->save();

    $文章->名称;// 返回 'Name in English' 假设当前应用语言环境是 'en' $article->getTranslation('name', 'nl'); // 返回 'Naam in het Nederlands'

    app()->setLocale('nl');

    $文章->名称;// 返回“荷兰语名称”

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

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

如果它不起作用,请告诉我,我会查看您的代码。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用带有 PDO 的 2 个不同 ID 从数据库中删除数据

来自分类Dev

从2个不同的表中选择值,并在具有相同ID的行中打印值

来自分类Dev

从2个不同的表中选择值,并在具有相同ID的行中打印值

来自分类Dev

如何将 MySQL 数据库中的数据存储到由 id 索引的数组中?

来自分类Dev

如何单击 2 个具有相同名称、无 ID 和相同类的链接中的 1 个。硒Java

来自分类Dev

在目录数据库中具有两个不同类别ID的产品ID

来自分类Dev

在目录数据库中具有两个不同类别ID的产品ID

来自分类Dev

如何使2个具有相同词/义,但Unicode差异哈希到相同ID的字符串?

来自分类Dev

合并两个具有相同 ID 的数据库行

来自分类Dev

通过Matlab中的“ ID”字段将具有相同字段名的2个结构连接起来

来自分类Dev

通过Matlab中的“ ID”字段将具有相同字段名的2个结构连接起来

来自分类Dev

如何在数据库中创建表,该表存储来自MS Access数据库中2个不同表的数据c#WPF中

来自分类Dev

将数据库中的多个值存储到一个变量中

来自分类Dev

将mysql数据库中的多行存储到一个变量中

来自分类Dev

我应该使用oauth2 jwt授权将什么存储到数据库中?

来自分类Dev

(PHP) 如何将数据库中 2 个不同表的数据显示到引导表

来自分类Dev

从不同数据库中的 2 个表中获取值到另一个表中

来自分类Dev

2个提交如何在git存储库中具有相同的文件信息?

来自分类Dev

PHP一次将数据插入到具有多个ID的数据库中?

来自分类Dev

在git的2个不同分支中合并2个具有相同名称的文件

来自分类Dev

在2个LinkedLists中删除具有相同数据的Node

来自分类Dev

在Oracle数据库中更新具有相同ID和名称的行

来自分类Dev

2个用户使用相同的设备和相同的应用程序,但登录ID不同-他们是否具有不同的gcm注册ID?

来自分类Dev

Doctrine2 Symfony2扩展实体在不同的包中但具有相同的数据库表名称

来自分类Dev

连接具有相同ID的不同数据

来自分类Dev

检查2个表是否具有相同的ID,如果表2中存在表1中的ID,则在列中返回1/0

来自分类Dev

python 3 将值从一个sqlite数据库中的分隔表存储到列表中

来自分类Dev

SQL在1个查询中插入具有不同ID的相同值

来自分类Dev

熊猫将DataFrame汇总到一个更大的DataFrame中,该数据库已经包含具有相同列名的相同索引

Related 相关文章

  1. 1

    如何使用带有 PDO 的 2 个不同 ID 从数据库中删除数据

  2. 2

    从2个不同的表中选择值,并在具有相同ID的行中打印值

  3. 3

    从2个不同的表中选择值,并在具有相同ID的行中打印值

  4. 4

    如何将 MySQL 数据库中的数据存储到由 id 索引的数组中?

  5. 5

    如何单击 2 个具有相同名称、无 ID 和相同类的链接中的 1 个。硒Java

  6. 6

    在目录数据库中具有两个不同类别ID的产品ID

  7. 7

    在目录数据库中具有两个不同类别ID的产品ID

  8. 8

    如何使2个具有相同词/义,但Unicode差异哈希到相同ID的字符串?

  9. 9

    合并两个具有相同 ID 的数据库行

  10. 10

    通过Matlab中的“ ID”字段将具有相同字段名的2个结构连接起来

  11. 11

    通过Matlab中的“ ID”字段将具有相同字段名的2个结构连接起来

  12. 12

    如何在数据库中创建表,该表存储来自MS Access数据库中2个不同表的数据c#WPF中

  13. 13

    将数据库中的多个值存储到一个变量中

  14. 14

    将mysql数据库中的多行存储到一个变量中

  15. 15

    我应该使用oauth2 jwt授权将什么存储到数据库中?

  16. 16

    (PHP) 如何将数据库中 2 个不同表的数据显示到引导表

  17. 17

    从不同数据库中的 2 个表中获取值到另一个表中

  18. 18

    2个提交如何在git存储库中具有相同的文件信息?

  19. 19

    PHP一次将数据插入到具有多个ID的数据库中?

  20. 20

    在git的2个不同分支中合并2个具有相同名称的文件

  21. 21

    在2个LinkedLists中删除具有相同数据的Node

  22. 22

    在Oracle数据库中更新具有相同ID和名称的行

  23. 23

    2个用户使用相同的设备和相同的应用程序,但登录ID不同-他们是否具有不同的gcm注册ID?

  24. 24

    Doctrine2 Symfony2扩展实体在不同的包中但具有相同的数据库表名称

  25. 25

    连接具有相同ID的不同数据

  26. 26

    检查2个表是否具有相同的ID,如果表2中存在表1中的ID,则在列中返回1/0

  27. 27

    python 3 将值从一个sqlite数据库中的分隔表存储到列表中

  28. 28

    SQL在1个查询中插入具有不同ID的相同值

  29. 29

    熊猫将DataFrame汇总到一个更大的DataFrame中,该数据库已经包含具有相同列名的相同索引

热门标签

归档