如何在MySQL中存储和获取封装的数组数据

时间:2019-03-01 21:20:38

标签: mysql arrays json

我想为我的WebApplication编写CMS。目前,我使用PHP作为数据源,例如

Automatic-Module-Name

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.padamski</groupId>
  <artifactId>test</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>com.pgs-soft</groupId>
      <artifactId>HttpClientMock</artifactId>
      <version>1.0.0</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>3.1.1</version>
        <configuration>
          <archive>
            <manifestEntries>
              <Automatic-Module-Name>com.padamski.test</Automatic-Module-Name>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.0</version>
        <configuration>
          <release>11</release>
        </configuration>
      </plugin>

    </plugins>
  </build>
</project>

每次在代码(PHP后端)中对其进行修改都是令人讨厌的。因此,我想为我使用两种语言(德语和英语)实现UserInterface。

我不知道在MySQL中管理此类封装的最佳方法是什么。

这里是一个可以理解的示例codepen

2 个答案:

答案 0 :(得分:0)

您有两个问题。首先,您要为数据的每个单独的变体存储格式化的字符串。仅应存储数据。数据是灵活且易于使用的,格式化的数据则不是。格式化应动态应用。

例如,只存储"bladder accumulator for up to 3 spare stroke (3x90°)",而不是存储3。将3检索出来,然后在可能的最后一刻将其格式化为:

$num = 3;
$format = "bladder accumulator for up to %d spare stroke (%dx90°)";
$text = sprintf($format, $num, $num);

然后向用户显示$text。它存储在数据库中。

接下来,我们添加本地化。 gettext提供了基本的本地化。 gettext的工作原理是用您编写的翻译表中的本地化字符串替换字符串。

$num = 3;
$format = gettext("bladder accumulator for up to %d spare stroke (%dx90°)");
$text = sprintf($format, $num, $num);

gettext调用将在适合您项目的语言文件中查找bladder accumulator for up to %d spare stroke (%dx90°)的翻译。对于德语,它将为locale/de/LC_MESSAGES。在该文件中,您将为翻译提供相同的格式选项Blasenspeicher mit bis zu %d Stellfahrt (%dx90°),而gettext将返回该格式。

Here's a tutorial on using gettext with PHP,将其全部设置并使用翻译文件。

gettext有其局限性,you can read all about them,但这是本地化的良好开端。

答案 1 :(得分:0)

如果要使用MySQL进行本地化,则需要一个名为语言的表,例如:

语言表:

import React, { Component } from 'react';
import logo from './logo.svg';
import './App.css';

import { AsyncStorage } from 'AsyncStorage';

class App extends Component {

  state = {};

  constructor(props) {
      super(props);
  }

  componentDidMount(){
      this.getItem().then((phone)=>{
        this.setState({
          phone
        });
      })
  }

  async getItem(){
    return await AsyncStorage.getItem('phone');
  }

  async setItem(){
    await AsyncStorage.setItem('phone','919303580');
  }

  render() {
    return (
      <div className="App">
        <p>Phone here:</p>
        {this.state.phone && <p>{this.state.phone}</p>}
        <button onClick={this.setItem.bind(this)}>Click me</button>
      </div>
    );
  }
}

export default App;

bladder_tanks表:

id (PRIMARY KEY) | language (VARCHAR) |
         1              en
         2              de

以此类推,您就明白了。

因此,现在当您需要英语版本时,您仅获取language_id 1的记录:

  id (PRIMARY KEY) | language_id (reference) | amount_bladder (UNSIGNED INT) | text (VARCHAR)         |
         1                  1                       0                              0
         2                  1                       1                         bladder accumulator for up to 1 spare stroke (1x90°)                 
         3                  2                       0                              0

保存或更新内容相同

  SELECT * FROM bladder_tanks WHERE language_id = 1 ORDER BY amount_bladder

您的控制器动作/功能可能如下所示:

  UPDATE bladder_tanks SET text = "blah blah" WHERE amount_bladder = 1 AND language_id = 1
  INSERT INTO bladder_tanks (language_id, amount_bladder, text) VALUES (1, 1, "blah blah")

希望为您提供如何工作的基本概念。 我试图使它尽可能简单,所以我省略了created_at,updated_at额外的列(不过,您应该根据自己的需要来构造它)