雄辩的关系过滤

Posted

技术标签:

【中文标题】雄辩的关系过滤【英文标题】:Eloquent Relation Filtering 【发布时间】:2013-06-19 21:15:10 【问题描述】:

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

选择 * 来自门票 在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 会像连接查询一样返回扁平化结果。

【问题讨论】:

【参考方案1】:

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

票证模型

内部的关系
//get tickets that are not Closed
public function openTickets()

    return $this->hasMany('App\Models\Status')->where('name','!=','Closed');

用法

$tickets = Ticket::with('openTickets')->get();

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

Laravel 4.2+

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

我觉得我试图让它变得过于复杂。

$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();

【讨论】:

【参考方案6】:

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

【讨论】:

工单属于一个状态,因为工单有一个 status_id。状态有很多票。

以上是关于雄辩的关系过滤的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 雄辩的 ORM 关系查询

Laravel 查询构建器与雄辩的关系

如何从雄辩关系中的第三个表中获取数据雄辩的多对多关系

雄辩的关系深度

雄辩的,每个表的多个关系

为啥 laravel 雄辩的关系返回空数组