我正在学习Laravel,我有以下表格和资源(模型,控制器等):
tickets
- id
- title
- projectID
- statusID
projects
- id
- title
status
- id
- title
我必须在首页上列出我的门票。没有必要说我需要Project-和Statustiltles而不是ID。目前我这样做:
Route::get('/', function()
{
$tickets = Ticket::all();
return View::make('layout')->with('tickets', $tickets);
});
我目前的输出是:
tickets->id, tickets->title, tickets->projectID, tickets->statusID
我想要的输出是
tickets->id, tickets->title, tickets->projects->title, tickets->status->title
所以我希望任何人都能理解我在这里要问的内容,也许可以给我一些帮助。谢谢!
解决方法:我必须先在我的数据库中设置foreign_keys。然后我使用了答案中提到的关系,它工作正常。
我的模特:
class Ticket extends \Eloquent {
protected $fillable = [];
public function project()
{
return $this->hasOne('Project', 'id', 'projectID');
}
public function status()
{
return $this->hasOne('Status', 'id', 'statusID');
}
}
我的观点:
@foreach($tickets as $key => $value)
...
<td>{{ $value->project->title }}</td>
<td>{{ $value->status->title }}</td>
...
@endforeach
答案 0 :(得分:2)
如果您正确配置关系,则可以使用 Laravel Eager Loading 功能毫无问题地执行此操作,例如:
渴望加载(Laravel docs)
存在急切加载以缓解N + 1查询问题......
class Ticket extends Eloquent {
public function project()
{
return $this->belongsTo('Project', 'projectID', 'id');
}
public function status()
{
return $this->belongsTo('Status', 'statusID', 'id');
}
}
现在,只需调用您想要的字段,例如:
foreach (Ticket::all() as $ticket)
{
echo $ticket->project->title;
echo $ticket->status->title;
}
Obs。:在您的返回对象/数组中,除非您进行手动连接等,否则无法查看关系字段。因此,只需配置您的关系并调用所需的字段即可。
抱歉我的英文
答案 1 :(得分:0)
定义指定自定义外键的关系(模型的默认值为status_id
和project_id
):
// Ticket model
public function project()
{
return $this->belongsTo('Project', 'projectID');
}
public function status()
{
return $this->belongsTo('Status', 'statusID');
}
然后急切加载相关模型:
$tickets = Ticket::with('project','status')->get();
// accessing:
foreach ($tickets as $ticket)
{
$ticket->status; // Status model with all its properties
$ticket->project; // Project model
}