首页 文章

雄辩的关系过滤

提问于
浏览
3

是否可以通过相关模型过滤Laravel的Eloquent ORM中的结果集?我知道Eloquent没有加入表格,但我想要的结果类似于:

SELECT * FROM ticket在ticket.status_id = statuses.id上的JOIN状态WHERE statuses.name!='Closed';

我在Eloquent找到的最接近的功能是:

$tickets = Ticket::with(array('status' => function($q) {
    return $q->where('name', '!=', 'Closed');
}))->get();

如果名称未关闭,这仍将返回所有票证,但仅返回状态关系 .

另外,我知道这可以在Fluent中完成,但我想使用Eloquent提供的返回的嵌套对象结构:

echo ticket->status->name;

Fluent返回展平结果作为联接查询 .

5 回答

  • 0

    看起来这个问题已经过时了,但是如果你在这里看到一个真正的答案,我们应该尽量避免过多地查询数据库,接受的答案是两次,但你可以通过一次拍摄来完成这个

    $tickets = Ticket::with('status')->whereHas('status', function($q) {
        return $q->where('name', '!=', 'Closed');
    })->get();
    
  • 0

    我觉得我试图让它变得太复杂 .

    $statuses = Status::where('name', '!=', 'Closed')->list('id');
    $tickets = Ticket::with('status')->whereIn('status_id', $statuses)->get();
    

    或者,我可以去Statuses的方向...我不是真的想做,但它会减少我的查询次数:

    $statusTickets = Status::with('ticket')->where('name', '!=', 'Closed')->get();
    
  • 3

    您可以在模型中覆盖newQuery,以便将其他查询应用于所有get()方法 - 请参阅http://usman.it/filter-eloquent-results-overriding-laravel/

  • 2

    您可以在模型中定义一个hasOne('status')关系并使用它,但我没有亲自尝试过这样做 .

  • 1

    尝试将查询范围添加到模型关系中 . Laravel. Use scope() in models with relation

    Laravel 4.2

相关问题