组织数据库结构

时间:2017-04-06 08:16:19

标签: php laravel

我在Laravel项目中有用户表。有一项任务,每个用户都需要设置他们说的最少1种语言和最多4种语言。对于每种语言用户都需要设置熟练程度。那么如何正确组织呢?

我想的方法很少:

  • 为每种语言和级别设置8个字段,其中一些可能保持为空

  • 在一个字段中存储一些结构,如JSON或其他一些,并在每次获取数据时解析它

两者看起来像一个拐杖。希望我不知道什么。

我需要一些最佳实践解决方案。

1 个答案:

答案 0 :(得分:0)

使用Many to Many relationship

例如,许多用户可能使用"英语"的语言。要定义此关系,需要三个数据库表:userslanguageslanguage_user

language_user表来自相关模型名称的字母顺序,并包含user_idlanguage_id列。

创建language_user表的迁移:

public function up()
{
    Schema::table('language_user', function (Blueprint $table) {
        $table->increments('id');

        //Language foregn key
        $table->integer('language_id')->unsigned();
        $table->foreign('language_id')->references('id')->on('languages');

        //User foregn key
        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users');

    });
}

定义关系:

用户模型

class User extends Model
{
    /**
     * The languages that belong to the user.
     */
    public function languages()
    {
        return $this->belongsToMany('App\Language');
    }
}

语言模型

class Language extends Model
{
    /**
     * The users that belong to the language.
     */
    public function users()
    {
        return $this->belongsToMany('App\User');
    }
}

现在你有一个更干净的用户/语言表,所有语言都将存储在language_user中。

聚苯乙烯。我假设您使用名为languages的表来存储语言,如果您不这样做,则还需要创建表格和模型。