2013-01-23 5 views
6

아래에 설명 된 것처럼 3 개의 테이블이 있습니다.laravel의 관계와 블레이드

Table 1(user): 
id username password Name Age 

Table 2(tasks): 
id task_name description 

Table 3(logs) 
id user_id task_id date hours 

표 관계 : 사용자 이름, 작업 이름, 날짜 및 시간과 로그를 얻을 수 있습니다 내가 달성하기 위해 노력하고

user has_many logs 
task has_many logs 

logs belongs_to user 
logs belongs_to task 

.

컨트롤러 :

return View::make('log.index') 
      ->with('logs',log::all()); 

블레이드 템플릿

@foreach($logs as $log) 
      <tr> 
       <td>{{$log->id}}</td> 
       <td>{{$log->users()->name}}</td> 
       <td>{{$log->tasks()->name}}</td> 
      <tr> 
@endforeach 

하지만없는이 각각의 테이블에서 사용자 이름 및 작업 이름을 가져올 수 있습니다. 어떤 도움을 주셔서 감사합니다.

+0

'{{$ log-> users() -> name}}'여러 사용자가 어떻게 하나의 이름을 가질 것으로 예상합니까? –

+0

@WaleedKhan 나는 laravel에 처음이다. 나는 그걸 시도했지만 didnt 일을하고 있었다. 이것도 역시 {{$ log-> users (user_id) -> name}} –

답변

10

더 좋은 방법은 당신의 로그 모델에 따라서

here을 설명 된대로, 모델의 역 hasMany의 관계를 정의하는 것입니다, 아마 당신은 정의해야 다음 중 하나를 사용할 수 있습니다 :

$log->user()->first()->name 

또는 더 나은 방법으로는 Dynam ic 등록 정보 :

$log->user->name 
+0

이 문제를 해결하는데 도움이 되겠습니다. – rahman

+0

'$ log-> user() -> first() -> name' 이것은 N + 1 문제. – Naresh

4

$ log-> users() 및 $ log-> tasks()는 쿼리 개체를 반환합니다. 아래에서 각 호출은 $ log-> users() -> get() 및 $ log-> tasks() -> get()을 호출하는 것과 동일한 결과를 반환합니다. 관계가 많으므로 많은 레코드를 검색하려면 $ log-> users 및 $ log-> tasks를 반복해야합니다.

@foreach($logs as $log) 
     <tr> 
      <td>{{$log->id}}</td> 
      <td> 
       @foreach($log->users as $user) 
       {{$user->name}}, 
       @endforeach 
      </td> 
      <td> 
       @foreach($log->tasks as $task) 
       {{$task->name}}, 
       @endforeach 
      </td> 
     <tr> 
@endforeach 

특정 사용자/작업을 로그에 첨부하려면 쿼리를 만들어야합니다. 그런 다음

class Log extends Eloquent { 
    protected $table = "logs"; 

    public function user(){ 
     return $this->belongsTo('User'); 
    } 
    public function task(){ 
     return $this->belongsTo('Task'); 
    } 
} 

을보기에 :

@foreach($logs as $log) 
     <tr> 
      <td>{{$log->id}}</td> 
      <td>{{$log->users()->where('id', '=', $userID)->first()->name}} </td> 
      <td>{{$log->tasks()->where('id', '=', $taskID)->first()->name}} </td> 
     <tr> 
@endforeach