У меня есть много-ко-многим так:Laravel 4 Eloquent ORM: Как обновить запись сводной таблицы, которая имеет составные первичные ключи
user
- user_id
user_blocks
- blocker_user_id
- blocked_user_id
- unblocked (Timestamp)
Где блокатор и blocked_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 как я не знаю, как определить Красноречивую модель с составным первичным ключом (I мы искали везде, и это, похоже, не вопрос, который кто-либо задал).
Я понимаю, что схема меньше, чем оптимизирована для Eloquent, но это прививка красноречиво на проект Codeigniter с заранее установленной схемой. В противном случае приятный опыт использования моделей Codeigniter.
Я создал запрос на перенос, который пытается реализовать эту важную, но отсутствующую функцию: https://github.com/laravel/framework/pull/1891 – igorsantos07