Композитные ключи 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']);
});