首先,我想告诉你,我已经在网上搜索了这个问题,但我还没能解决这个问题。
我的问题是表的主键。
我有两张桌子,活动和活动客人
+-----------+
| 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');