尝试插入具有复合主键的记录时出错
Getting error when trying to insert a record that has composite primary keys
我有一个多对多关系,所以实现需要用两个主键创建新的table,
这是新的 table :
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';
}
确定它在数据库中创建了新记录但是尽管它 return 这个 错误
PDO::lastInsertId() 期望参数 1 为字符串,数组给定
根据我的推断,您有一个 Friendship
Eloquent 模型附加到 friendship
枢轴 table。问题在于 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);
我遇到了同样的错误。 lastInsertId 调用是为自动递增表完成的。根据定义,它们只有简单的 primary_keys。
如果您在模型中添加
protected $primaryKey = ['FIELD1', 'FIELD2'];
public $incrementing = false;
那么它应该有用,它对我有用。现在它不会调用 lastInsertId
我有一个多对多关系,所以实现需要用两个主键创建新的table,
这是新的 table :
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';
}
确定它在数据库中创建了新记录但是尽管它 return 这个 错误 PDO::lastInsertId() 期望参数 1 为字符串,数组给定
根据我的推断,您有一个 Friendship
Eloquent 模型附加到 friendship
枢轴 table。问题在于 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);
我遇到了同样的错误。 lastInsertId 调用是为自动递增表完成的。根据定义,它们只有简单的 primary_keys。
如果您在模型中添加
protected $primaryKey = ['FIELD1', 'FIELD2'];
public $incrementing = false;
那么它应该有用,它对我有用。现在它不会调用 lastInsertId