Композитные ключи laravel schema builder
Мне нужны два составных первичных ключа, и только один должен быть AUTO INCREMENT
, что я пробовал до сих пор:
// first try
Schema::create("kitchen", function($table) {
$table->increments('id');
$table->integer('restaurant_id');
$table->primary(array('id', 'restaurant_id'));
$table->string('name');
});
// second try
Schema::create("kitchen", function($table) {
$table->increments('id');
$table->integer('restaurant_id');
$table->primary('restaurant_id');
$table->string('name');
});
Ничего не работает. Сообщение об ошибке:
[Exception]
SQLSTATE[42000]: Syntax error or access violation: 1068 Multiple primary ke
y defined (SQL: alter table
кухня add primary key kitchen_restaurant_id
_primary(
restaurant_id )) (Bindings: array (
))
Решение без Schema
builder: во-первых, мне нужно добавить два составных первичных ключа, а затем мне нужно сделать один из AUTO INCREMENT
, но я думаю, что построитель Schema
не может этого сделать.
Примечание: Я могу сделать это с помощью SQL, я имею в виду отсутствие проблем с MySQL
Любые предложения?
Резюме:
Что мне нужно,
http://oi39.tinypic.com/es91ft.jpg
с Schema
builder
Ответы
Ответ 1
Вы можете сделать это с небольшой помощью от неподготовленного метода:
Schema::create("kitchen", function($table) {
$table->increments('id');
$table->integer('restaurant_id');
$table->string('name');
});
DB::unprepared('ALTER TABLE `kitchen` DROP PRIMARY KEY, ADD PRIMARY KEY ( `id` , `restaurant_id` )');
Это проверено и работает!
Я знаю это немного позже, и вы, возможно, пошли дальше, но кто-то другой может столкнуться с этим:)
Ответ 2
Яркие приращения() задают столбец как целое число без знака. Имея это в виду, у вас есть несколько способов достижения желаемых составных клавиш.
Вы можете использовать либо interger(), либо unsignedInteger() и установить для autoIncrements значение true:
$table->integer($column, $autoIncrement = false, $unsigned = false);
$table->unsignedInteger($column, $autoIncrement = false);
//Returns $this->integer($column, $autoIncrement, true);
Затем вы можете указать Eloquent, которые являются вашими первичными ключами через primary().
Ваша схема:: create() должна выглядеть примерно так:
Schema::create('kitchen', function($table) {
$table->integer('id', true, true);
$table->integer('restaurant_id')->unsigned(); //or $table->integer('restaurant_id', false, true);
$table->foreign('restaurant_id')
->references('id')->on('restaurants')
->onDelete('cascade');
$table->string('name');
$table->primary(array('id', 'restaurant_id'));
});
Предполагая, что таблица вашего ресторана использует $table- > increments ('id'), это должно сделать "id" и "restaurant_id" ваши основные ключи, а также сопоставить "restaurant_id" с таблицей "id" ресторана.
Ответ 3
Кажется, у вас есть что-то, что в настоящее время невозможно с Laravel, поскольку ->increments()
уже устанавливает ->primary()
, поэтому, когда вы добавляете его самостоятельно, вы получаете два предложения PRIMARY
в результирующем SQL.
Но вы можете попытаться создать таблицу с неправильным первичным ключом, отбросив ее, а затем воссоздав ее:
Schema::create("kitchen", function($table)
{
$table->increments('id');
$table->integer('restaurant_id');
$table->string('name');
});
Schema::table('kitchen', function($table)
{
$table->dropPrimary('kitchen_id_primary');
});
Schema::table('kitchen', function($table)
{
$table->primary(array('id', 'restaurant_id'));
});
Ответ 4
Еще один вариант из Dayle Rees
Schema::create('example', function($table)
{
$table->integer('id');
$table->string('username');
$table->string('email');
$keys = array('id', 'username', 'email');
$table->primary($keys);
});
Ответ 5
Нет смысла иметь автоинкремент как часть составного первичного ключа, так как он будет уникальным для каждой записи.
Если вам нужен первичный ключ автоинкремента и уникальный составной ключ, например, 2 других столбца, такие как "restaurant_id" и "name":
Schema::create("kitchen", function($table)
{
$table->increments('id');
$table->integer('restaurant_id');
$table->string('name');
$table->unique(['restaurant_id', 'name']);
});