考虑以下问题:
$tickets = Account::with('tickets')->where('name','LIKE',"%{$search}%")->paginate(10);
这就是我颠倒它的方式:
$tickets = Ticket::whereHas('account', function($q) use ($search)
{
$q->where('name', 'LIKE', '%'. $search .'%');
})->paginate(10);
还有另一种方法可以反转第一个查询吗?
我一直在寻找一种执行第一个查询的方法,只接收来自ticket表的结果。因为现在我当然会收到门票作为每个退回账户的财产。
答案 0 :(得分:0)
回答您的评论:是的,您可以从第一个查询中获取门票。这是如何做到的,虽然分页是在帐户的上下文中运行的,所以我们将跳过它并检索所有帐户:
// returns Eloquent Collection of Account models
$accounts = Account::with('tickets')->where('name','LIKE',"%{$search}%")->get();
// returns array of Ticket arrays (not models here)
$tickets = $accounts->fetch('tickets')->collapse();
你可以看到它可能但有点麻烦。当然,您总是可以为此准备辅助方法,但仍然可以获得数组而不是模型等
所以实际上我建议使用第二种解决方案,但在这里我会给你一些让它变得简单易用的东西:
// Ticket model
public function scopeHasCategoryNameLike($query, $search)
{
$query->whereHas('categories', function($q) use ($search) {
$q->where('name', 'like', "%{$search}%");
});
}
然后就这么简单:
$tickets = Ticket::hasCategoryNameLike($search)->paginate(10);