雄辩的关系过滤

时间:2013-06-23 02:42:08

标签: orm laravel laravel-4 eloquent

是否可以通过相关模型过滤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返回展平结果作为联接查询。

6 个答案:

答案 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();