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

时间:2015-02-10 16:55:19

标签: 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')->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插入DataBase

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 个答案:

答案 0 :(得分:2)

根据我的推断,你有一个Friendship雄辩模型附加到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);

答案 1 :(得分:1)

我遇到了同样的错误。 lastInsertId调用是为自动增量表完成的。根据定义,它们只有简单的primary_keys。

如果您添加模型

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

然后它应该工作,它为我做了。现在它不会调用lastInsertId