laravel 中的关系和刀片
Posted
技术标签:
【中文标题】laravel 中的关系和刀片【英文标题】:relationship and blade in laravel 【发布时间】:2013-01-06 23:30:09 【问题描述】:如下所述,我有 3 个表格。
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
但无法从相应的表中获取用户名称和任务名称。任何帮助表示赞赏。
【问题讨论】:
$log->users()->name
您如何期望多个用户拥有一个名称?
@WaleedKhan 我是 laravel 的新手,我只是在尝试,但没有奏效。也试过 $log->users(user_id)->name
【参考方案1】:
更好的方法是在你的模型中定义反向 hasMany 关系,如 here 所记录的那样
所以在你的日志模型中,可能你需要定义:
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
甚至更好,通过使用动态属性:
$log->user->name
【讨论】:
$log->user()->first()->name
这会导致 N+1 问题。【参考方案2】:
$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
【讨论】:
以上是关于laravel 中的关系和刀片的主要内容,如果未能解决你的问题,请参考以下文章