4

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

SELECT * FROM Tickets JOIN statuses on tickets.status_id = statuses.id 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 会像连接查询一样返回扁平化结果。

4

6 回答 6

4

这个问题似乎很老了,但如果你在这里寻找一个真正的答案,我们应该尽量避免查询数据库太多,接受的答案做两次,但你可以像这个

$tickets = Ticket::with('status')->whereHas('status', function($q) {
    return $q->where('name', '!=', 'Closed');
})->get();
于 2015-10-13T20:43:17.480 回答
2

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

$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();
于 2013-06-24T18:44:25.373 回答
1

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

于 2013-07-30T23:04:40.133 回答
0

您也许可以在模型中定义 hasOne('status') 关系并使用它,但我个人没有尝试这样做。

于 2013-06-24T14:55:32.337 回答
0

尝试将查询范围添加到您的模型关系中。 拉拉维尔。在具有关系的模型中使用 scope()

Laravel 4.2+

于 2015-01-12T08:09:36.733 回答
0

另一种干净的方法是为关闭的票创建一个单独的关系

票证模型内部的关系

//get tickets that are not Closed
public function openTickets()
{
    return $this->hasMany('App\Models\Status')->where('name','!=','Closed');
}

用法

$tickets = Ticket::with('openTickets')->get();
于 2020-11-26T05:17:48.877 回答