如何通过3加入查询加入Laravel Eloquent模型而无需foreach

时间:2018-05-26 14:22:22

标签: php laravel laravel-5 eloquent

无论如何要从此代码中删除foreach吗?

    $user = \Auth::user();
    foreach ($user->categories as $category) {
        $channels[] = $category->channel();
    }
    return $channels;

我想使用分页功能,但foreach无法使用!

3 个答案:

答案 0 :(得分:0)

Eloquent不执行JOIN查询,如果您确实需要JOIN,则需要下拉到查询构建器并自行编写查询。

但是,如果您只是想避免N + 1问题,那么您应该使用预先加载。这将为每种关系类型创建1个额外的WHERE foreign_id IN(...)查询。总的来说会有:

  • 1查询以获取用户记录
  • 1个查询以获取属于该用户的所有类别
  • 1个查询,用于获取属于任何先前提取的类别的所有通道

由于您已在内存中安装了用户实例,因此可以避免通过lazy eager loading重新获取用户记录。

答案 1 :(得分:0)

Laravel paginator文档有点简短,特别是手动创建/分页就像你必须做的那样....这里简要概述了它们如何工作如何使它们工作......

没有魔力,分页器会为每个页面调用控制器功能。请求中将包含分页信息。实际选择和切片页面是你的工作。分页器只是呈现它......这是工作的重要部分......

你的$ channels []数组必须被切片并正确返回......就像这样......

public function channels(){

    // we have to build the paginator ourselves, your result is an array...
    $user = \Auth::user();
    foreach ($user->categories as $category) {
        $channels[] = $category->channel();
    }

    // this basically gets the request's page variable...This is how pagination works under the hood... we defaults to 1
    $page = Paginator::resolveCurrentPage('page') ?: 1;

    // Assume 15 items per page... so start index to slice our array
    $startIndex = ($page - 1) * 15;

    // Length aware paginator needs a total count of items... to paginate properly
    $total = count($channels);

    // Eliminate the non relevant items... We have to slice the array ourselves...
    $results = array_slice($channels, $startIndex, 15);

    $paginatedChannels =  new LengthAwarePaginator($results, $total, 15, $page, [
        'path' => Paginator::resolveCurrentPath(),
        'pageName' => 'page',
    ]);
    return view('yourViews', compact('paginatedChannels'));
}

关键是你必须自己准备数据切片......

您可以发布您的数据结构,以便我们可以提供更好的查询本身替代方案......但是如果$ category-> channel()函数有效,这应该有效...

答案 2 :(得分:0)

这是怎么回事?

if (this.chosenList === Side.All)