2013-03-08 5 views
2

У меня есть много-ко-многим так: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.

+0

Я создал запрос на перенос, который пытается реализовать эту важную, но отсутствующую функцию: https://github.com/laravel/framework/pull/1891 – igorsantos07

ответ

4

Кажется, что в настоящее время Eloquent не обрабатывает составные первичные ключи явно. Тем не менее, я был в состоянии решить эту проблему, сделав модель таблицы user_blocks и указать только один из первичных ключей:

class Blocker extends Model { 

    protected $table = "user_blocks"; 
    protected $primaryKey = "blocker_user_id"; 
    public $timestamps = false; // Don't track nonexistent created_at/updated_at columns 

} 

Тогда, в логике, чтобы обновить разблокированные колонки я просто сделал следующее:

$blocked_user = Blocker::where('blocker_user_id', $user->user_id) 
    ->where('blocked_user_id', $user_to_be_unblocked_id) 
    ->first(); 

$blocked_user->unblocked = Blocker::freshTimestamp(); 

$blocked_user->save(); 

Это не самый элегантный способ решить проблему, но она работает до тех пор, пока Eloquent не получит поддержку составных первичных ключей.

 Смежные вопросы

  • Нет связанных вопросов^_^