Синхронизация не работает должным образом, когда таблица имеет две сводные точки и составной первичный ключ - PullRequest
0 голосов
/ 11 октября 2018
class ProjectEmployees extends Migration
{

    public function up()
    {

        // employees assigned to each project
        Schema::create('project_employees', function (Blueprint $table) {
            $table->integer("project_id")->unsigned();
            $table->integer("employee_id")->unsigned();
            $table->tinyInteger("is_project_leader")->unsigned()->default(0);
            $table->tinyInteger("is_manager")->unsigned()->default(0);
        });


        Schema::table('project_employees', function($table) {


            $table->primary(['project_id', 'employee_id']);

            // FK
            $table->foreign('employee_id')->references('id')->on('employees');
            $table->foreign('project_id')->references('id')->on('projects');
        });

    }

}

У меня есть модель для проектов и другая для сотрудников.Я хочу иметь возможность назначать сотрудников руководителями и руководителями проектов.У меня есть этот метод:

 function assignProjectLeaders($project, $employees)
    {    
        $syncData = $this->addPivotValue($employees, ['is_project_leader' => true]);
        $project->projectLeaders()->sync($syncData);           
    }

function addPivotValue($items, $pivotValues): array
{
    $pivotData = array_fill(0, count($items), $pivotValues);
    $syncData = array_combine($items, $pivotData);
    return $syncData;
}

Поэтому я хочу, чтобы метод assignProjectLeaders устанавливал указанных сотрудников в качестве лидеров проекта для данного объекта проекта.Однако, если сотрудник уже связан с проектом в качестве менеджера проекта, это не сработает из-за ограничения первичного ключа (похоже, он пытается снова вставить пару (проект, сотрудник) вместо простого обновления столбца is_project_leader до 1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...