2015-04-29 3 views
3

У меня есть следующие миграции, чтобы создать мой таблицы базы данных MySQLLaravel/MySql Уникальная строка, основанная на идентификаторе?

public function up() 
{ 
    Schema::create('project_auth_keys', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('project_id')->unsigned(); 
     $table->string('key', 800); 
     $table->string('first_name', 80); 
     $table->string('last_name', 80); 
     $table->timestamps(); 

     // link project id with real project id 
     $table->foreign('project_id')->references('id')->on('projects'); 
    }); 
} 

Теперь то, что я хочу ВЗ выполнить это сделать «ключ» «уникальный» ... Но я знаю, что я могу сделать это, просто изменив

$table->string('key', 800)->unique(); 

Но я не хочу, чтобы он был уникальным для всей таблицы. Я хочу сделать его уникальным на основе project_id.

Например, запись с project_id из 1 и запись с project_id из 2 могут иметь один и тот же ключ, однако не может быть двух одинаковых ключей в одном и том же project_id.

Является ли это чем-то, что я могу сделать в MySQL или мне нужно будет сделать это, как правило, в моем контроллере? Я могу сделать это в своем контроллере не проблема, но я предпочел бы сделать это в своей базе данных, если это возможно.

EDIT

Пробовал добавлять

$table->primary(array('project_id', 'key')); 

Добавлена ​​правильно ниже $ table-> первичный (массив ('project_id', 'ключ'));

Однако после этого я получаю сообщение об ошибке при попытке выполнить миграцию.

enter image description here

+0

Звучит так, как будто вы хотите создать составной ключ, включающий как project_id, так и ключ, кроме как внешний ключ, а не первичный ключ. – SLin

+0

почему бы вам не создать 2 таблицы. Один для идентификатора проекта, а затем один для ключа, связанного с первичным ключом? (я не уверен, почему вы хотели бы сделать это вообще, поэтому я не уверен, как бы я написал это точно ...но это идея) –

ответ

2

Что-то вроде этого?

$table->primary(array('project_id', 'key')); 

Вы можете найти то же самое в документации here.

Решение 1. Поскольку у вас уже установлен столбец приращений, он принимает то же самое, что и первичный ключ по умолчанию.

Чтобы использовать составной первичный ключ, вы можете либо удалить этот столбец, либо вычислить этот столбец по-разному, иначе это вызовет дубликат первичного ключа.

Кроме того, ограничение длины первичного ключа составляет «767», и, следовательно, вы должны уменьшить длину ключа до более низкого, чем это возможно.

Я просто попытался следующие, и она работает:

Schema::create('test', function(Blueprint $table) 
{ 
$table->integer('project_id')->unsigned(); 
$table->string('key', 100); // make sure the key length is within sql standards(767), "800" is not acceptable for primary key 
$table->string('first_name', 80); 
$table->string('last_name', 80); 
$table->timestamps(); 
// Add primary 
$table->primary(array('key', 'project_id')); 
}); 

Решение 2: Вы можете просто выполнить проверку в контроллер, который дает вам большую гибкость, я считаю, и имеют ту же структуру, только с идентификатором в качестве первичного ключ. Однако я не очень уверен в производительности. Вам нужно будет это проверить.

Надеюсь, это поможет.

+0

Не думаю, что я пытаюсь сделать «ключ» уникальным, но только уникальным с тем же «project_id», поэтому, если «project_id» отличается, то «ключ» может быть другим. – kevingilbert100

+0

На самом деле после того, как вы отредактировали это, позвольте мне попробовать и посмотреть, работает ли это. – kevingilbert100

+0

Должен работать по мне. Это составной первичный ключ, комбинация должна быть уникальной .. –

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