首先,我想告诉你,我已经在网上搜索了这个问题,但我还没能解决这个问题。
我的问题是表的主键。
我有两张桌子,活动和活动客人

+-----------+
| event     |
+-----------+
| eventid   |
+-----------+

+-------------+
| event_guest |
+-------------+
| guestid     |
| eventid     |
| firstname   |
| lastname    |
| email       |
+-------------+

每个活动都有许多event_guest,但每个客人的电子邮件在每个活动上必须是唯一的。
在我的控制器上,我想通过在eventguest模型上使用firstorcreate方法获取或创建:
EventGuests::firstOrCreate(['eventid' => $eventid,'firstname' => 'Ivan', 'lastname'=>'Bravo', 'email'=>'[email protected]');

如果未在事件上设置电子邮件,则必须记录条目。
+-----------+----------+-----------+-----------+----------------+
|  guestid  | eventid  | firstname | lastname | email           |
+-----------+----------+-----------+-----------+----------------+
|         1 |        1 | Ivan      | Bravo     | [email protected] |
+-----------+----------+-----------+-----------+----------------+

我需要的是eventid作为主键,guestid作为auto_increment字段,这样每次事件都可以重置为1。例如:
+-----------+----------+-----------+-----------+----------------+
|  guestid  | eventid  | firstname | lastname | email           |
+-----------+----------+-----------+-----------+----------------+
|         1 |        1 | Ivan      | Bravo     | [email protected] |
|         2 |        1 | John      | Doe       | [email protected]   |
|         1 |        2 | Ivan      | Bravo     | [email protected] |
+-----------+----------+-----------+-----------+----------------+

我还需要电子邮件作为一个独特的字段,以防止重复行。
目前我正在使用laravel 5迁移,但当我尝试重置主字段时,它会提示此错误:
Multiple primary key defined (SQL: alter table `event_guest` add primary key event_guest_eventid_guestid_primary(`eventid`, `guestid`))

这是我的迁移代码:
    Schema::create('event_guest', function(Blueprint $table) {
                $table->integer('guestid', true);
                $table->integer('eventid');
                $table->integer('contactid')->nullable();
                $table->string('firstname', 256);
                $table->string('lastname', 256);
                $table->string('email', 256);
                $table->unique( array('email','name') );
                $table->primary(array('eventid','guestid'));

            });

我真的需要帮助才能正确理解这一点。
我过去使用:
create table `event_guest` (
    `guestid` int(11) NOT NULL AUTO_INCREMENT,
    `eventid` int(11) NOT NULL DEFAULT '0',
    `firstname` varchar(255) NOT NULL,
    `lastname` varchar(255) NOT NULL,
    `email` varchar(255) NOT NULL,
    PRIMARY KEY (`eventid`,`guestid`),
    CONSTRAINT guest UNIQUE (eventid,email)
) ENGINE=MyISAM

现在

最佳答案

迁移代码有两个问题阻止您创建所需的表。
首先,默认的mysql引擎是innodb,它不允许在复合主键上自动递增。因此,需要将引擎显式设置为myisam:

$table->engine = 'MyISAM';

其次,当您将列设置为auto increment时,laravel的schema builder假定它是主键,并在生成create语句时使该列成为主键。因此,当下一个查询试图定义复合主键时,guestid列上已经存在主键-因此出现重复主键错误。
解决这个问题的方法是将guestid定义为标准整数列,创建复合键,然后更新guestid列,使其自动递增。不幸的是,除了重命名列之外,schema builder不支持任何alter操作,因此您需要使用底层db层并执行原始查询。
总之,迁移代码应该如下所示:
Schema::create('event_guest', function(Blueprint $table) {
    $table->engine = 'MyISAM';
    $table->integer('guestid');
    $table->integer('eventid');
    $table->integer('contactid')->nullable();
    $table->string('firstname', 256);
    $table->string('lastname', 256);
    $table->string('email', 256);
    $table->unique( array('email','name') );
    $table->primary(array('eventid','guestid'));
});

DB::statement('ALTER TABLE event_guest MODIFY guestid INTEGER NOT NULL AUTO_INCREMENT');

07-24 09:22