【问题标题】: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() 是哪个函数,但同样,它需要一个字符串参数,并得到其他东西。我只能从这里说这些了。

标签: php sql laravel models


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-14
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多