2014-12-04 6 views
0

나는 Magazine이라는 모델이 있습니다. 이 모델은 잡지 표를 나타냅니다.하나의 테이블에 다 대 일, laravel의 관계

magazines 
--id 
--name 

또한 Transfer라는 모델이 있습니다. 이 모델은 전송 테이블을 나타냅니다. 이 표에서 제품 이전에 대한 정보를 저장하고 싶습니다.

transfers 
--id 
--source 
--target 

는 두 가지 중요한 기둥이 있으며, 소스가 나는 제품을 받고에서 잡지의 ID이며, 목표는 내가 제품을 넣어 잡지의 ID입니다.

Eloquent 모델에서 관계를 어떻게 작성해야합니까? 나는 이런 일을했다.

public function source() 
{ 
    return $this->belongsTo('Magazine', 'source'); 
} 

public function target() 
{ 
    return $this->belongsTo('Magazine', 'target'); 
} 

그러나, 작동하지 않는다. $ transfer-> source를 호출하면이 열 (정수 값)에 저장되어있는 ID 만 얻습니다. 하지만 나는 잡지 대상을 얻고 싶습니다. 메소드 이름을 source()에서 magazine()으로 변경하면 Eloquent가 Magazine 객체를 반환하며 이것이 맞습니다. 당신은 단지 ID를 얻을 것이다 $transfer->source 호출하는 경우 소스 및 대상은 같은 테이블

답변

1

귀하의 필드와 메소드가 겹치는 소스의 이름을 액세스 한 후 소스를 너무

$transfer = Transfer::with('source')->find(123); 

을로드해야합니다. 이제 다음과 같이 할 수 있습니다 :

$transfer->source()->getResult()->name; 

분명히 이것은 관계를 처리하는 방법이 아닙니다.

즉, 예상대로 작동하려면 메서드 나 테이블 필드의 이름을으로 변경하십시오. 나는 이것을 제안한다 :

table transfers: id, source_id, target_id 

// Transfer model 
public function source() 
{ 
    return $this->belongsTo('Magazine', 'source_id'); 
} 

public function target() 
{ 
    return $this->belongsTo('Magazine', 'target_id'); 
} 
+0

감사합니다! 테이블 필드 만 변경했습니다. 너무 쉽습니다. –

0

에 표시하는 경우

어떻게 관계를 만들어야합니다. 당신은

$nameOfSource = $transfer->source->name 
+1

'attribute'과'relationship'이 같은 이름을 가진 한 열렬한 로딩은 중요하지 않다. –