反转Eloquent查询的方法不止一种?

时间:2014-04-19 17:16:17

标签: php laravel eloquent

考虑以下问题:

$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表的结果。因为现在我当然会收到门票作为每个退回账户的财产。

1 个答案:

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