2015-02-10 45 views
0

我有一個多到許多關係的記錄,所以實施需要創建新表有兩個主鍵獲取錯誤,,當試圖插入具有複合主鍵

這裏的新表:

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是字符串數組給定

+0

你的意思是創建一個新的表與複合主鍵(由2個字段組成) – Veverke 2015-02-10 17:01:14

+0

是的,我的意思是 – 2015-02-10 17:03:35

+0

首先,從你得到的錯誤,它似乎並不是插入現有主鍵的問題,而不是類型不兼容/不一致問題。你需要確定你傳遞的是「User1Id」是一個字符串(我不熟悉PHP,不知道「給定的數組」是什麼意思) – Veverke 2015-02-10 17:07:47

回答

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

它適用於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()) – 2015-02-10 21:55:32

1

我遇到了同樣的錯誤。 lastInsertId調用完成自動增量表。它們根據定義只有簡單的primary_keys。

如果你在你的模型

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

加那麼它應該工作,它爲我做的。現在它不會調用lastInsertId