尝试插入具有复合主键的记录时出错
Posted
技术标签:
【中文标题】尝试插入具有复合主键的记录时出错【英文标题】:Getting error when trying to insert a record that has composite primary keys 【发布时间】:2015-04-10 19:41:12 【问题描述】:我有一个多对多关系,因此实现需要创建具有两个主键的新表 ,,
这是新表:
public function up()
Schema::create('friendship', function(Blueprint $table)
$table->integer('user1_id')->index('fk_user_has_user_user1_idx');
$table->integer('user2_id')->index('fk_user_has_user_user2_idx');
$table->boolean('state')->nullable();
$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$table->primary(['user1_id','user2_id']);
);
但是当尝试使用这个函数插入数据时: //将新的FriendShip插入数据库
public function InsertFriendShip($User1Id, $User2Id, $State)
$friend = new FriendShip();
$friend->User1_Id = $User1Id;
$friend->User2_Id = $User2Id;
$friend->State = $State;
// save new FriendShip to the database
if(!$friend->save())
return 'created';
好的,它在数据库中创建新记录,但是虽然它返回了这个错误 PDO::lastInsertId() 期望参数 1 是字符串,给定数组
【问题讨论】:
您的意思是使用复合主键(由 2 个字段组成)创建一个新表 是的,我的意思是 首先,从您得到的错误来看,插入现有主键似乎不是问题,而是类型不兼容/不一致问题。您需要确保作为“User1Id”传递的内容是一个字符串(我不熟悉 php,不知道“给定数组”是什么意思) "User1Id" 如你所见,是一个整数 >> $table->integer('user1_id')->index('fk_user_has_user_user1_idx');而且我确定我也以整数传递 我不知道 lastInsertId() 是哪个函数,但同样,它需要一个字符串参数,并得到其他东西。我只能从这里说这些了。 【参考方案1】:据我推断,Friendship
Eloquent 模型附加到 friendship
数据透视表。这样做的问题是 Eloquent 不能使用复合主键,所以没有真正的方法可以做到这一点。
您应该查看Laravel Eloquent Docs 以了解如何实现多对多关系。在你的情况下,你可以有一个看起来像这样的User
模型:
class User extends Eloquent
public function friends()
return $this->belongsToMany('User', 'friendship', 'user1_id', 'user2_id');
public function addFriend(User $user)
$this->friends()->attach($user->id);
public function removeFriend(User $user)
$this->friends()->detach($user->id);
您可以轻松地为任何用户添加或删除朋友:
$user1 = User::find($id1);
$user2 = User::find($id2);
$user1->addFriend($user2);
//or
$user1->removeFriend($user2);
【讨论】:
它适用于 removeFriend ,但是 addFriend 它得到这个错误 >> SQLSTATE[23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(viswalldb
.friendship
, CONSTRAINT fk_user_has_user_user1
FOREIGN KEY (user1_id
) REFERENCES users
(user_id
) ON DELETE NO ACTION ON UPDATE CASCADE) (SQL: insert into friendship
() values ())【参考方案2】:
我遇到了同样的错误。 lastInsertId 调用是为自动递增表完成的。根据定义,它们只有简单的primary_keys。
如果你添加你的模型
protected $primaryKey = ['FIELD1', 'FIELD2'];
public $incrementing = false;
那么它应该可以工作,它对我有用。现在它不会调用 lastInsertId
【讨论】:
以上是关于尝试插入具有复合主键的记录时出错的主要内容,如果未能解决你的问题,请参考以下文章