Laravel资源:: all包含来自另一个表的值

时间:2014-05-27 16:02:17

标签: php laravel eloquent

我正在学习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

2 个答案:

答案 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_idproject_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
}