У меня есть отношение «многие ко многим», например:
user
- user_id
user_blocks
- blocker_user_id
- blocked_user_id
- unblocked (Timestamp)
Где blocker и block_user_id являются составным первичным ключом, оба существуют как внешние ключи для user_id пользовательской таблицы. Обе таблицы являются InnoDB.
Когда я пытаюсь сделать следующее:
$user = User::find(1)
$blocked_user = $user->blocked()->where('blocked_user_id', 2)->first();
$blocked_user->unblocked = User::freshTimestamp();
$blocked_user->save();
Кажется, я хочу обновить столбец в пользовательской таблице, а не в таблице user_blocks. Это просто ошибка sql, когда пользовательская таблица пытается обновить несуществующий столбец unblocked
.
Я попытался добавить ->pivot
и ->pivot()
к назначению для $blocked_user в примере. Первый выдает ошибку в Eloquent\Model::performUpdate, Call to a member function update() on a non-object
, а второй выдает call_user_func_array() expects parameter 1 to be a valid callback, class 'Illuminate\Database\Query\Builder' does not have a method 'pivot'
в Eloquent\Builder::__call.
Модель пользовательской таблицы определяет отношение к самой себе как:
public function blocked() {
return $this->belongsToMany(
'User',
'user_blocks',
'blocker_user_id',
'blocked_user_id'
)->withPivot('unblocked');
}
Для таблицы user_blocks нет модели, так как я не знаю, как определить модель Eloquent с составным первичным ключом (я искал везде, и, похоже, никто не задавал этот вопрос).
Я понимаю, что схема недостаточно оптимизирована для Eloquent, но это привнесение красноречия в проект Codeigniter с предварительно установленной схемой. В остальном приятный опыт использования моделей Codeigniter.