是否可以通过相关模型过滤Laravel的Eloquent ORM中的结果集?我知道Eloquent没有加入表格,但我希望的结果类似于:
SELECT * 来自门票 在tickets.status_id = statuses.id上的JOIN状态 WHERE statuses.name!='已关闭';
我在Eloquent中找到的最接近的功能是:
$tickets = Ticket::with(array('status' => function($q) {
return $q->where('name', '!=', 'Closed');
}))->get();
如果名称未关闭,这仍将返回所有票证,但仅返回状态关系。
另外,我知道这可以在Fluent中完成,但我想使用Eloquent提供的返回的嵌套对象结构:
echo ticket->status->name;
Fluent返回展平结果作为联接查询。
答案 0 :(得分:3)
看来这个问题已经过时了,但是如果你在这里看到一个真正的答案,我们应该尽量避免过多地查询数据库,接受的答案是两次,但是你可以通过像这样一枪
$tickets = Ticket::with('status')->whereHas('status', function($q) {
return $q->where('name', '!=', 'Closed');
})->get();
答案 1 :(得分:2)
我觉得我试图让它变得太复杂。
$statuses = Status::where('name', '!=', 'Closed')->list('id');
$tickets = Ticket::with('status')->whereIn('status_id', $statuses)->get();
或者,我可以走向状态的方向......我真的不想这样做,但它会减少我的查询次数:
$statusTickets = Status::with('ticket')->where('name', '!=', 'Closed')->get();
答案 2 :(得分:1)
您可以在模型中覆盖newQuery,以便对所有get()方法应用其他查询 - 请参阅http://usman.it/filter-eloquent-results-overriding-laravel/
答案 3 :(得分:0)
您可以在模型中定义hasOne('status')关系并使用它 但我个人并没有试图这样做。
答案 4 :(得分:0)
尝试将查询范围添加到模型关系中。 Laravel. Use scope() in models with relation
Laravel 4.2 +
答案 5 :(得分:0)
另一种干净的方法是为已关闭门票创建单独的关系
机票模型中的关系
//get tickets that are not Closed
public function openTickets()
{
return $this->hasMany('App\Models\Status')->where('name','!=','Closed');
}
用法
$tickets = Ticket::with('openTickets')->get();