2013-03-08 5 views
2

내가 다 대다 관계과 같이가 사용자 테이블의 user_id에 대한 외래 키로 존재합니다. 두 테이블 모두 InnoDB이다.Laravel 4 웅변 ORM은 :</p> 차단제와 blocked_user_id 복합 기본 키입니다 <pre><code>user - user_id user_blocks - blocker_user_id - blocked_user_id - unblocked (Timestamp) </code></pre> <p>, 모두 : 복합 기본 키가있는 피벗 테이블 항목을 업데이트하는 방법

나는 다음을 수행하려고 할 때 : 그것은 생각하는 것 같다

$user = User::find(1) 
$blocked_user = $user->blocked()->where('blocked_user_id', 2)->first(); 

$blocked_user->unblocked = User::freshTimestamp(); 
$blocked_user->save(); 

차라리 user_blocks 테이블보다, 사용자 테이블에 열을 업데이트하고 싶습니다. 이것은 단순히 사용자 테이블이 존재하지 않는 열 unblocked으로 업데이트하려고 시도하는 SQL 오류입니다.

예에서 $ blocked_user에 대한 할당에 ->pivot->pivot()을 추가하려고했습니다. 첫 번째 오류는 Eloquent \ Model :: performUpdate, Call to a member function update() on a non-object에서 발생하며 후자는 Eloquent \ Builder :: __ 호출에서 call_user_func_array() expects parameter 1 to be a valid callback, class 'Illuminate\Database\Query\Builder' does not have a method 'pivot'을 제공합니다.

사용자 테이블의 모델은 그 자체로 관계를 정의

: 나는 복합 기본 키 웅변 모델을 정의하는 방법을 알고하지 않는 한 user_blocks 테이블에 대한 모델이 없습니다

public function blocked() { 
    return $this->belongsToMany(
     'User', 
     'user_blocks', 
     'blocker_user_id', 
     'blocked_user_id' 
    )->withPivot('unblocked'); 
} 

(I 어디서나 수색했는데 누군가가 묻는 질문이 아닌 것 같습니다.)

나는 스키마가 Eloquent에 최적화 된 것보다 적다는 것을 알고 있지만 이것은 사전 설정된 스키마로 Codeigniter 프로젝트에 웅변적이다. Codeigniter 모델 사용에 대한 유쾌한 경험.

+0

중요하지만 누락 된이 기능을 구현하려고하는 풀 요청을 만들었습니다 : https://github.com/laravel/framework/pull/1891 – igorsantos07

답변

4

Eloquent는 현재 복합 기본 키를 명시 적으로 처리하지 않는 것 같습니다. 단순히 다음과 같은 짓을 차단 해제 열을 업데이트하는 논리에,

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 

} 

다음 : 그러나, 나는 user_blocks 테이블의 모델을 만들기 만 기본 키 중 하나를 지정하여 문제를 해결할 수 있었다

$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가 복합 기본 키를 지원할 때까지 작동합니다.