2014-10-13 2 views
4

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

SQLSTATE [42000]: Ошибка синтаксиса или нарушение прав доступа: 1068 Рассеянный первичный KE
у определенного (SQL: изменить таблицу doc_tag добавить первичный ключ doc_tag_id_tag_primar
у (id_tag)

Schema::create('doc_tag', function(Blueprint $table) 
{ 
    $table->integer('id_doc')->unsigned(); 
    $table->primary('id_doc'); 
    $table->foreign('id_doc') 
       ->references('id') 
       ->on('doc'); 
    $table->integer('id_tag')->unsigned(); 
    $table->primary('id_tag'); 
    $table->foreign('id_tag') 
       ->references('id') 
       ->on('tag'); 
}); 

Я знаю код SQL, который: (Но я не знаю, как перевести этот SQL-код в Laravel)

CREATE TABLE IF NOT EXISTS `Doc_project`.`document_has_Tags` (
    `document_id_document` INT NOT NULL, 
    `Tags_id_Tag` INT NOT NULL, 
    PRIMARY KEY (`document_id_document`, `Tags_id_Tag`), 
    INDEX `fk_document_has_Tags_Tags1_idx` (`Tags_id_Tag` ASC), 
    INDEX `fk_document_has_Tags_document1_idx` (`document_id_document` ASC), 
    CONSTRAINT `fk_document_has_Tags_document1` 
    FOREIGN KEY (`document_id_document`) 
    REFERENCES `Doc_project`.`document` (`id_document`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_document_has_Tags_Tags1` 
    FOREIGN KEY (`Tags_id_Tag`) 
    REFERENCES `Doc_project`.`Tags` (`id_Tag`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 

Это отношение N: N

У кого-то есть идея?

ответ

8

Красноречивым не поддерживает несколько первичных ключей, но если вы все еще хотите, отправить массив в свой primary(...).

Так что в вашем случае:

Schema::create('doc_tag', function(Blueprint $table) 
{ 
    $table->integer('id_doc')->unsigned(); 
    $table->integer('id_tag')->unsigned(); 

    $table->primary(['id_tag', 'id_doc']); 

    $table->foreign('id_doc') 
       ->references('id') 
       ->on('doc');  
    $table->foreign('id_tag') 
       ->references('id') 
       ->on('tag'); 
}); 
+0

Благодарим за помощь. В MySQL я вижу, что идентификатор является первичным сейчас, но это нормально, что есть такая же ошибка, когда я запускаю эту оценку: php artisan migrate? – Alexis

2

Если вы хотите создать первичный ключ на 2 или более столбцов, следует использовать:

$table->primary(['id_doc','id_tag']); 
+0

Спасибо Marcin! – Alexis

Смежные вопросы