【问题标题】:Adding Faker data to Laravel Database将 Faker 数据添加到 Laravel 数据库
【发布时间】:2020-04-04 03:46:02
【问题描述】:

我正在 Laravel 中创建这个应用程序。 我有 3 张桌子,员工、部门和薪水 Employees 表有 id、name、dept_name、gender 等列。 部门有 dept_name、emp_id 和 Salaries 有monthlySalaries、emp_id、dept_name

以上所有表格都是由这些各自的模型创建的。

我面临的问题是,当我运行 DatabaseSeeder 时,值确实会输入到数据库中,但它们并不一致,例如。 id = 1 和 Dept_name = Production 的 Employee 表,而在 Department 表中 emp_id = 1 和 Dept_name = 技术支持。 这个问题也流入了薪水表。

我知道,我做错了什么,但我似乎无法弄清楚是什么。 我尝试在 id(employee table) 上创建一个引用 emp_id(salaries) 的 PK,但没有运气。 我什至尝试过更新下面的 DB 播种脚本,但这不会创建薪水条目,在某些情况下甚至将 emp_id(departments) 留空。

任何关于我做错了什么的帮助/指针将不胜感激。 感谢您抽出时间阅读本文:)

员工模型:

Schema::create('employees', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('dept_name');
            $table->string('name');
            $table->string('gender');
            $table->timestamp('date_of_joining');
            $table->dateTime('date_of_birth');
            $table->timestamps();
}

部门模型:

 Schema::create('departments', function (Blueprint $table) {
        $table->string('dept_name');
        $table->unsignedInteger('employee_id');
        $table->timestamps();
    });

薪酬模式:

        Schema::create('salaries', function (Blueprint $table) {
            $table->string('monthlySalary');
            $table->unsignedInteger('employee_id');
            $table->string('dept_name');
            $table->timestamps();
        });

数据库播种器

public function run()
    {
        $this->call([UsersTableSeeder::class]);
        //creates employees & Departments
        factory(App\Employee::class, 25)->create()->each(function ($employee) {
            $department = factory(App\Department::class)->make();
            $employee->department()->save($department);

            $salary = factory(App\Salary::class)->make();
            $employee->salary()->save($salary);
        });
    }

应用\员工

public function department()
    {
        return $this->hasOne(Department::class);
    }

    public function Salary()
    {
        return $this->hasOne(Salary::class);
    }

应用\部门

public function employees()
    {
        return $this->hasMany(Employee::class);
    }
    public function salaries()
    {
        return $this->hasMany(Salary::class);
    }

应用\薪资

public function employeeSalary()
    {
        return $this->belongsTo(Employee::class);
    }

【问题讨论】:

  • "员工表id = 1,Dept_name = Production,Department 表emp_id = 1,Dept_name = Tech Support" dept_names 应该相同还是?
  • 名称应该相同。本质上,一名员工只能拥有一个部门和一份薪水。这就是我想要在这里实现的目标
  • 但是工厂会伪造数据?
  • 我同意,faker 会伪造数据,但现在发生的情况是,如果在我的 employees 表中有一行 id 为 1,dept_name 为 Production,departments 表显示 emp_id 为1 但 dept_name 作为技术支持。在这种情况下,它不应该显示生产,即使它是伪造数据。我只是想在不同的表之间建立关系,因为我有几个 SQL 查询,它们运行并显示与 MySQL 终端显示的数据不同的数据

标签: mysql laravel faker


【解决方案1】:

您编写的 Laravel 代码看起来是正确的,并且看起来它正在做它应该做的事情 - 我认为问题主要是由于您的数据库方案。

理想情况下,您应该退后一步,考虑您的数据库方案如何为您正在使用的对象建模。例如,您现在的方案中可能存在以下关系:

  • Employee 有零个或多个 Departments
  • Employee 有零个或多个 Salaries

而且有些数据是跨表重复的(我认为1):

  • 一个Employee 有一个dept_name 并且还与零个或多个Departments 相关联,每个dept_name 可能有不同的dept_name

我认为你真正想要的是:

  • 一个Employee 恰好属于一个Department
  • 一个Employee 正好有一个Salary

可以通过像这样构建表格来避免这些问题:

employees               departments            salaries
---------               -----------            --------
id                      id                     id
department_id           name                   monthly_salary
salary_id
name
gender
...other columns...

每个员工都有一个department_id,它指的是departments 表中的一行(员工和部门之间的一对多关系)。 每个员工都有一个salary_id,它指的是salaries 表中的一行(员工和工资之间的一对多关系)。

如果您以这种方式构建数据,员工的部门名称来自departments 表(并且来自该表)。部门名称不匹配不会有任何问题,因为该信息只有一个来源。

关系数据库中这种数据建模方法的术语是数据库规范化。网络上有很多很多资源可以指导您更好地构建数据。

1 我假设一名员工只能属于一个部门。这可能不是您要建模的内容。

【讨论】:

  • 嗨,是的,我正在尝试完全按照您的建议进行操作。一名员工正好有一个部门和一份薪水。最初我曾想过使用 I'd(employees) 成为 emp_id (departments) 的主键,但效果不佳。我会试试你的模式模式。但是,我如何确保在 3 个表中插入相同的值?我的意思是我如何建立一对多和多对一的关系,尤其是主键和外键。这是我完全迷失的东西。除非我天生就在不知道的情况下在代码中这样做。
  • 您不必确保将树值插入此架构中,而不是在任何地方都有 dept_name 您将通过正确的关系访问部门名称
  • 我将如何在架构中设置关系。所有这些都是我的新手,而且似乎有点困难。另外,我在各处都使用了 dept_name 而不是 dept_id,因为在插入数据期间,部门名称会不断变化,例如。 00 将是 HR,然后是几个条目,它将是 05 是 HR。所以,我想,如果我有一个 PK-外键关系,以及某种增量,那么这个问题可能不会发生。
猜你喜欢
  • 2019-08-01
  • 2019-04-11
  • 2021-07-05
  • 2019-10-19
  • 2018-01-22
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多