Ошибка при попытке вставить запись с составными первичными ключами

у меня есть Отношение многие ко многим, поэтому для реализации потребуется создать новую таблицу с двумя первичными ключами,

вот новая таблица:

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 будет строкой, задан массив

0

Решение

Из того, что я могу сделать вывод, у вас есть 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);
2

Другие решения

Я столкнулся с той же ошибкой. Вызов lastInsertId выполняется для автоинкрементных таблиц. Они по определению имеют только простые primary_keys.

Если вы добавите в свою модель

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

Тогда это должно работать, это сделало для меня. Теперь он не будет вызывать lastInsertId

1

По вопросам рекламы [email protected]