尝试插入具有复合主键的记录时出错

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

【讨论】:

以上是关于尝试插入具有复合主键的记录时出错的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra 中使用复合主键的慢插入时间

mysql外键仅引用复合主键的一部分

复合主键的一部分可以用作另一个表的复合主键的一部分吗?

如何为具有复合主键的表构建外键?

休眠仅保存具有复合主键中的父外键的子表条目

使用 Spring-data-cassandra 查询具有复合主键的表