Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在没有foreach的情况下,如何在Laravel雄辩模型中通过3个连接进行查询_Php_Laravel_Laravel 5_Eloquent - Fatal编程技术网

Php 在没有foreach的情况下,如何在Laravel雄辩模型中通过3个连接进行查询

Php 在没有foreach的情况下,如何在Laravel雄辩模型中通过3个连接进行查询,php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,是否仍有要从此代码中删除到foreach $user = \Auth::user(); foreach ($user->categories as $category) { $channels[] = $category->channel(); } return $channels; 我想使用paginate函数,但不可能使用foreach的foreach Eloquent不执行联接查询,如果您确实需要联接,则需要下拉到查询生成器并自

是否仍有要从此代码中删除到
foreach

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

我想使用paginate函数,但不可能使用foreach的
foreach

Eloquent不执行联接查询,如果您确实需要联接,则需要下拉到查询生成器并自行编写查询

但是,如果您只是试图避免N+1问题,那么您应该使用渴望加载。这将为每个关系类型在(…)查询中创建1个额外的
外来id。因此,总共将有:

  • 1查询以获取用户记录
  • 1查询以获取属于用户的所有类别
  • 1查询以获取属于先前获取的任何类别的所有频道

由于内存中已经有用户实例,因此可以避免通过重新获取用户记录。

Laravel paginator文档有点短,尤其是手动创建/分页时,您将不得不这样做。。。。这里是他们如何工作的简要概述如何使他们工作

没有魔法,分页器会为每个页面调用控制器函数。请求中将包含分页信息。您的工作是实际选择和切片页面。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()函数起作用的话,这应该是可行的…

这样怎么样

$categories = \Auth::user()->categories()->pluck('id')->toArray();
return \App\Channel::wherein('category_id', $categories)->paginate();

您可以使用('categories.channel')加载关系
Auth::user()->