2013-01-23 16 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を初めて使っています。 {$ log-> users(user_id) - > name}} –

答えて

10

より良い方法は、おそらくあなたが定義する必要があり、あなたのログモデルでそうhere

を文書化して、あなたのモデルに逆hasManyの関係を定義することです:

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

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

次に、あなたのビューで

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

またはそれ以上の値を使用することもできます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 

ログに特定のユーザー/タスクを追加する場合は、クエリを作成する必要があります。

@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