2014-09-06 2 views
0

Laravel의 피벗 테이블에 일대 다 관계를 추가하는 데 문제가 있습니다. 어쩌면 불가능할 수도 있습니다. 비슷하지만 꽤, 로그 데이터와 같은 -Laravel 피벗 테이블에 일대 다 더하기

나는 다음과 같은 구조 우리에게 할당 된 직원 채용을 가지고, 이러한 과제 각각에 대해 우리가 일부 데이터를 저장해야

에게 있습니다. 우리는 또한 지불 속도 및 상태 등의 각 과제에 대한 피벗 특정 데이터를 저장해야하는, 그래서 우리는

그래서 우리가 작업 모델을 피벗에서 이러한 저장

class Job extends \Eloquent { 
public function staff() { 
     return $this->belongsToMany('Staff')->withPivot('rate', 'status'); 
    } 
} 

A (나는 다음의 간단한 유지하고있어) 직원 모델

class Staff extends \Eloquent { 
public function jobs() { 
     return $this->belongsToMany('Job')->withPivot('rate', 'status'); 
    } 

} 

그래서 잘 작동하고 테이블 'job_staff'

에 데이터를 저장하지만 우리가 저장됩니다 'job_events'라는 세 번째 테이블이 지금 필요로하는 해당 작업에 대한 직원 지정에 대해 발생한 모든 이벤트의 로그이므로 이러한 이벤트는 직원 또는 작업 모델에만 국한되지 않고 직원을 작업에 할당하는 데 사용됩니다.

  • 은 '에 도착 사이트'예를 들어 어떤 이벤트가 될 수
  • 이 '에서 클럭'
  • '툭 브레이크'
  • '왼쪽 사이트'
'아웃 클럭'

등등 .. 그래서 job_staff의 피봇 테이블은 많은 이벤트를 가지며 이벤트는 하나의 job_staff에 속합니다.

어떤 포인터 감사하겠습니다 .. https://github.com/laravel/framework/issues/2093#issuecomment-39154456

하지만 성공 - 나는 믿고있어

은 내가 job_staff 테이블에 대한 피벗 모델이 필요하고, 같은 내가 좋아하는 뭔가를 구현하기 위해 노력했습니다/아이디어!

덕분에 시릴

답변

4

이 고려할 필요가 :이 때문이다

// custom pivot model can be accessed only in the context of relation 
$jobStaff = $staff->jobs->first()->pivot; 

// additional model for the pivot table can be accessed like any other 
$jobStaff = JobStaff::whereStaffId($staff)->whereJobId($job)->first(); 

, Pivot은 관계 컨텍스트를 만드는 몇 가지 인수를 인스턴스화된다.또한

use Illuminate\Database\Eloquent\Relations\Pivot; 

class JobStaffPivot extends Pivot { 

    protected $table = 'job_events'; 
    // eloquent default name would be: 
    // protected $table = 'event_job_staff'; 

    public function events() 
    { 
     return $this->hasMany('Event', 'assignement_id'); 
     // eloquent default would be: 
     // return $this->hasMany('Event', 'job_staff_id'); 
    } 
} 

use Illuminate\Database\Eloquent\Model; 

class JobStaff extends Model { 

    protected $table = 'job_events'; 

    public function job() 
    { 
     return $this->belongsTo('Job'); 
    } 

    public function staff() 
    { 
     return $this->belongsTo('Staff'); 
    } 

    public function events() 
    { 
     return $this->hasMany('Event'); 
    }  
} 

:

당신은 Model를 사용하여보다 효율적으로 제어 할 수 있지만, 꽤 자주 상황, 당신은 오히려 관련 모델에 ->pivot 전화 줄에 자신을 발견 할 것이다, 그래서 둘 다 만드는 것이 좋습니다 그래서 마지막으로

$job = 5; 
$staff = 10; 
$jobStaff = JobStaff::for($job, $staff)->first(); 

// or 
$job = Job::find($someId); 
$staff = Staff::find($anotherId); 
$jobStaff = JobStaff::forThe($job, $staff)->first(); 

// JobStaff model 
public function scopeForThe($query, $job_id, $staff_id) 
{ 
    if ($job_id instanceof Job) $job_id = $job_id->getKey(); 
    if ($staff_id instanceof Staff) $staff_id = $staff_id->getKey(); 

    $query->where(compact('job_id', 'staff_id')); 
} 

이처럼 사용할 수 있습니다 :

,617을 나는이 작업을 수행하기 위해 범위 이하로 만들 것
$jobStaff = $staff->jobs->first()->pivot->events; 

$jobStaff = JobStaff::forThe($job, $staff)->first()->events; 
+0

답장을 보내 주셔서 감사합니다. 실제 구현의 복잡함에 맞게 조금 조정 한 후에이 작업을 수행하게되었지만 이는 큰 도움이되었습니다! 감사합니다 –

+0

이 경우 이벤트를 어떻게로드 하시겠습니까? – clod986

관련 문제