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

Php 尝试插入具有复合主键的记录时出错,php,sql,laravel,models,Php,Sql,Laravel,Models,我有一个多对多关系,因此实现需要使用两个主键创建新表 这是新表: public function up() { Schema::create('friendship', function(Blueprint $table) { $table->integer('user1_id')->index('fk_user_has_user_user1_idx'); $table->integer('user2_id')->inde

我有一个多对多关系,因此实现需要使用两个主键创建新表

这是新表:

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']);
    });
}
但尝试使用此函数插入数据时: //将新友谊插入数据库

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是字符串,数组给定

根据我的推断,您有一个
友谊
雄辩的模型附加到
友谊
透视表。这样做的问题是,Eloquent不适用于复合主键,因此没有真正的方法可以做到这一点

您应该看看,看看如何实现多对多关系。在您的情况下,您可能有一个
用户
模型,它看起来像这样:

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);

根据我的推断,您有一个
友谊
雄辩的模型附加到
友谊
透视表。这样做的问题是,Eloquent不适用于复合主键,因此没有真正的方法可以做到这一点

您应该看看,看看如何实现多对多关系。在您的情况下,您可能有一个
用户
模型,它看起来像这样:

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);

根据我的推断,您有一个
友谊
雄辩的模型附加到
友谊
透视表。这样做的问题是,Eloquent不适用于复合主键,因此没有真正的方法可以做到这一点

您应该看看,看看如何实现多对多关系。在您的情况下,您可能有一个
用户
模型,它看起来像这样:

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);

根据我的推断,您有一个
友谊
雄辩的模型附加到
友谊
透视表。这样做的问题是,Eloquent不适用于复合主键,因此没有真正的方法可以做到这一点

您应该看看,看看如何实现多对多关系。在您的情况下,您可能有一个
用户
模型,它看起来像这样:

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调用。根据定义,它们只有简单的主键

如果你加入你的模型

protected $primaryKey = ['FIELD1', 'FIELD2'];
public $incrementing = false;

那它就应该起作用了,对我来说。现在它不会调用lastInsertId了,我遇到了同样的错误。对自动递增的表执行lastInsertId调用。根据定义,它们只有简单的主键

如果你加入你的模型

protected $primaryKey = ['FIELD1', 'FIELD2'];
public $incrementing = false;

那它就应该起作用了,对我来说。现在它不会调用lastInsertId了,我遇到了同样的错误。对自动递增的表执行lastInsertId调用。根据定义,它们只有简单的主键

如果你加入你的模型

protected $primaryKey = ['FIELD1', 'FIELD2'];
public $incrementing = false;

那它就应该起作用了,对我来说。现在它不会调用lastInsertId了,我遇到了同样的错误。对自动递增的表执行lastInsertId调用。根据定义,它们只有简单的主键

如果你加入你的模型

protected $primaryKey = ['FIELD1', 'FIELD2'];
public $incrementing = false;

那它就应该起作用了,对我来说。现在它不会调用lastInsertId

您的意思是使用复合主键(由2个字段组成)创建一个新表是的,我的意思是首先,从您得到的错误来看,插入现有主键似乎不是问题,而是类型不兼容/不一致问题。您需要确保作为“User1Id”传递的是一个字符串(我不熟悉PHP,不知道“array-given”是什么意思)“User1Id”是一个整数,正如您所看到的>>$table->integer('user1\u id')->index('fk\u-user\u-has\u-user\u-user1\u-idx');我确信我传递的是integer,我不知道哪个函数是lastInsertId(),但它需要一个字符串参数,而得到的是其他的。这就是我在这里所能说的。你的意思是用复合主键(由2个字段组成)创建一个新表。是的,我的意思是首先,从你得到的错误来看,插入现有主键似乎不是问题,而是类型不兼容/不一致问题。您需要确保作为“User1Id”传递的是一个字符串(我不熟悉PHP,不知道“array-given”是什么意思)“User1Id”是一个整数,正如您所看到的>>$table->integer('user1\u id')->index('fk\u-user\u-has\u-user\u-user1\u-idx');我确信我传递的是integer,我不知道哪个函数是lastInsertId(),但它需要一个字符串参数,而得到的是其他的。这就是我在这里所能说的。你的意思是用复合主键(由2个字段组成)创建一个新表。是的,我的意思是首先,从你得到的错误来看,插入现有主键似乎不是问题,而是类型不兼容/不一致问题。您需要确保作为“User1Id”传递的是一个字符串(我不熟悉PHP,不知道“array-given”是什么意思)“User1Id”是一个整数,正如您所看到的>>$table->integer('user1\u id')->index('fk\u-user\u-has\u-user\u-user1\u-idx');我确信我传递的是integer,我不知道哪个函数是lastInsertId(),但它需要一个字符串参数,而得到的是其他的。这就是我在这里所能说的。你的意思是用复合主键(由2个字段组成)创建一个新表。是的,我的意思是首先,从你得到的错误来看,插入现有主键似乎不是问题,而是类型不兼容/不一致问题。您需要确保作为“User1Id”传递的是一个字符串(我不是