Добавление данных Faker в базу данных Laravel

Я создаю это приложение на Laravel. У меня есть 3 таблицы: «Сотрудники», «Отделы» и «Зарплаты». В таблице «Сотрудники» есть столбцы: id, имя, dept_name, пол и т. Д. У Dept_name есть dept_name, emp_id, а у Salaries есть monthSalaries, emp_id, dept_name

Все приведенные выше таблицы были созданы этими соответствующими моделями.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я запускаю DatabaseSeeder, значения вводятся в БД, но они не согласованы, например. Таблица сотрудников с id = 1 и Dept_name = Production, в то время как в таблице Department emp_id = 1 и Dept_name = Tech Support. И эта проблема перетекает и в таблицу зарплат.

Я знаю, что делаю что-то не так, но не могу понять, что именно. Я попытался создать ПК по идентификатору (таблица сотрудников), ссылаясь на emp_id (зарплаты), но не повезло. Я даже попытался обновить приведенный ниже сценарий сеялки БД, но это не привело бы к созданию записей о зарплате, а в некоторых случаях даже оставило emp_id (департаменты) пустым.

Любая помощь / указатели на то, что я делаю неправильно, были бы очень признательны. Спасибо, что нашли время прочитать это :)

Модель сотрудника:

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);
    }

person BigRed Cup    schedule 10.12.2019    source источник
comment
Таблица сотрудников с id = 1 и Dept_name = Production, в то время как в таблице Department emp_id = 1 и Dept_name = Tech Support должны быть одинаковые имена dept_name или?   -  person mrhn    schedule 11.12.2019
comment
Имена должны быть такими же. По сути, у одного сотрудника может быть только один отдел и одна зарплата. Это то, чего я пытаюсь достичь здесь   -  person BigRed Cup    schedule 11.12.2019
comment
а фабрики будут фальсифицировать данные?   -  person mrhn    schedule 11.12.2019
comment
Я согласен, фейкер подделает данные, но сейчас происходит следующее: если в таблице моих сотрудников есть строка, в которой id равен 1, а dept_name - Production, таблица департаментов показывает emp_id как 1, а dept_name как техподдержку. Разве в этом случае он не должен показывать производство, даже если он подделывает данные. Я просто пытаюсь установить связь между разными таблицами, потому что у меня есть несколько SQL-запросов, которые запускаются и показывают разные данные, чем то, что показывает терминал MySQL.   -  person BigRed Cup    schedule 11.12.2019


Ответы (1)


Код Laravel, который вы написали, выглядит правильно, и похоже, что он делает именно то, что должен делать - я думаю, что проблема в основном из-за вашей схемы базы данных.

В идеале вам следует сделать шаг назад и подумать о том, как ваша схема базы данных моделирует объекты, с которыми вы работаете. Например, в имеющейся у вас схеме возможны следующие отношения:

  • Employee имеет ноль или более Departments
  • Employee имеет ноль или более Salaries

И некоторые данные дублируются (я думаю, 1) в таблицах:

  • Employee имеет dept_name и также связан с нулем или более Departments, каждый из которых может иметь разные 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 Я предполагаю, что сотрудник может принадлежать ровно к одному отделу. Возможно, это не то, что вы пытаетесь смоделировать.

person Kryten    schedule 10.12.2019
comment
Привет, да, я пытаюсь сделать именно то, что вы предлагаете. У одного сотрудника ровно один отдел и одна зарплата. Первоначально я думал об использовании я (сотрудники), чтобы стать первичным ключом к emp_id (отделам), которые не работали должным образом. Я опробую ваш шаблон схемы. Однако как мне убедиться, что одни и те же значения вставляются в 3 таблицы? Я имею в виду, как мне настроить отношения «один ко многим» и «многие к одному», особенно с первичным и внешним ключом. Это то, в чем я полностью потерялся. Если только я не делаю это по своей сути в коде, не зная. - person BigRed Cup; 11.12.2019
comment
Вам не нужно гарантировать, что значения дерева вставляются в эту схему, вместо того, чтобы иметь dept_name везде, где вы будете получать доступ к имени отдела через отношения, что является правильным - person mrhn; 11.12.2019
comment
Как мне настроить отношения в схеме. Во всем этом я новичок, и это кажется немного сложным. Кроме того, я везде использовал dept_name вместо dept_id, потому что во время вставки данных названия отделов продолжали меняться, например. 00 будет HR, а затем несколько записей вниз, это будет 05 HR. Итак, я подумал, что если бы у меня было отношение PK-Внешний ключ и какое-то приращение, то эта проблема могла бы не возникнуть. - person BigRed Cup; 11.12.2019