Frage Zusammengesetzte Schlüssel Laravel Schema Builder


Ich brauche zwei zusammengesetzte Primärschlüssel und nur einer sollte sein AUTO INCREMENT was ich bisher versucht habe:

// 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');
            });

Keine funktioniert. Fehlermeldung:

[Exception]
SQLSTATE[42000]: Syntax error or access violation: 1068 Multiple primary ke
y defined (SQL: alter table
Kücheadd primary key kitchen_restaurant_id
_primary(
Restaurant_ID)) (Bindings: array (
))
 

Die Lösung ohne Schema Builder: Zuerst muss ich zwei zusammengesetzte Primärschlüssel hinzufügen und dann muss ich einen der AUTO INCREMENT aber ich denke Schema Builder kann das nicht tun.

Hinweis: Ich kann das mit machen SQLIch meine kein Problem mit MySQL

Irgendwelche Vorschläge?

Zusammenfassung:

Was ich brauche, ist;

http://oi39.tinypic.com/es91ft.jpg

mit Schema Erbauer


11
2018-06-12 12:08


Ursprung


Antworten:


Sie können dies mit ein wenig Hilfe von der unvorbereiteten Methode tun:

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` )');

Dies ist getestet und funktioniert!

Ich weiß, dass es ein bisschen spät ist, und Sie könnten weitergezogen sein, aber jemand anderes könnte auf das stoßen :)


9
2017-11-17 16:51



Eloquent's increments () setzt die Spalte als vorzeichenlose Ganzzahl. In diesem Sinne haben Sie mehrere Möglichkeiten, Ihre gewünschten zusammengesetzten Schlüssel zu erreichen.

Sie können entweder interger () oder unsignedInteger () verwenden und autoIncrements auf true setzen:

 $table->integer($column, $autoIncrement = false, $unsigned = false);

 $table->unsignedInteger($column, $autoIncrement = false);
 //Returns $this->integer($column, $autoIncrement, true);

Dann könnten Sie Eloquent sagen, welches Ihre Primärschlüssel über primary () sind.

Ihr Schema :: create () sollte wie folgt aussehen:

 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'));
 });

Angenommen, Ihr Restauranttisch verwendet $ table-> increments ('id'), sollte dies 'id' und 'restaurant_id' zu Ihren Primärschlüsseln machen, während auch 'restaurant_id' mit der Restauranttabelle 'id' übereinstimmt.


5
2017-11-17 20:16



Es macht keinen Sinn, das Autoinkrement als Teil eines zusammengesetzten Primärschlüssels zu haben, da es ohnehin für jeden Datensatz eindeutig ist. Wenn Sie einen Autoinkrement-Primärschlüssel und einen eindeutigen zusammengesetzten Schlüssel für zB 2 andere Spalten wie 'restaurant_id' und 'name' möchten:

Schema::create("kitchen", function($table) 
{
    $table->increments('id');
    $table->integer('restaurant_id');
    $table->string('name');
    $table->unique(['restaurant_id', 'name']);
});

2
2018-03-31 16:00



Eine weitere Option von Tagle Rees

Schema::create('example', function($table)
{
    $table->integer('id');
    $table->string('username');
    $table->string('email');
    $keys = array('id', 'username', 'email');
    $table->primary($keys);
});

1
2018-05-11 06:56



Es scheint, dass du etwas getroffen hast, das momentan mit Laravel nicht möglich ist ->increments() schon setzt ->primary() Wenn du es selbst hinzufügst, endet es mit zwei PRIMARY Klauseln in der resultierenden SQL.

Sie können jedoch versuchen, die Tabelle mit dem falschen Primärschlüssel zu erstellen, sie zu löschen und dann neu zu erstellen:

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'));
});

0
2018-06-12 18:41