Как добавить уникальный ключ для 2 столбцов: employee_id и только месяц и год из столбца даты - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть таблица, где у меня есть все данные о сотруднике.Я хочу сделать employee_id и только месяц и год из date_of_salary уникальными в таблице.Для этого конкретного идентификатора сотрудника и месяца / года должна присутствовать только одна строка.Date_of_salary - это столбец с типом данных date.

Я попытался использовать следующее, но это работает для идентификатора сотрудника и полной даты.Требуется несколько записей за один месяц.

$table->unique(['employee_id', 'date_of_salary']);

Это моя полная функция для миграции

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

        $table->unsignedInteger('employee_id')->required();
        $table->date('date_of_salary')->required();

        $table->foreign('employee_id')
              ->references('id')
              ->on('employees')
              ->onDelete('restrict');

        $table->unique(['employee_id', 'date_of_salary']);

        $table->timestamps();
    });
}

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

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Создано 3 разных поля в базе данных для дня, месяца и года.Сделал employee_id, month и year уникальным ключом с тремя именами столбцов.

0 голосов
/ 20 декабря 2018

->unique() означает, например, столбец date_of_salary имеет уникальные даты.Таким образом, вы не можете добавить несколько раз «2018-12-21», только один раз во весь столбец.

Я думаю, вам нужно ->primary(['employee_id', 'date_of_salary']), если вы хотите уникальные строки по нескольким столбцам.

| employee_id | date_of_salary |
+-------------+----------------|
| 1           | 2018-11-21     | <- OK
| 1           | 2018-12-21     | <- OK
| 2           | 2018-12-21     | <- OK
| 1           | 2018-12-21     | <- Not possible
...