laravel hydrateRaw/fromQuery 和分页预加载

laravel hydrateRaw/fromQuery and eager loading with pagination

我目前发现您可以合成原始 sql 查询。

我有以下查询:

DB::table(DB::raw('(SELECT *, Y(location) AS longitude, X(location) AS latitude FROM meetings WHERE MBRCONTAINS(@quadrat, location)) AS sub'))
            ->select(DB::raw('(FLOOR(SQRT(POW((@ibk_breite - sub.latitude) * 111, 2) + POW((@ibk_laenge - sub.longitude) * 111 * ABS(COS(RADIANS(@ibk_breite))),2)))) AS distance, sub.*, latitude, longitude'));

我补水如下

$meetings = Meeting::fromQuery($query->toSql());

在 blade 视图中,我需要从不同的表中获取一些额外的数据,例如:

 $meeting->user

引用用户模型。但是,如果我没有完全错的话,那会导致 for each 循环中出现 n+1 问题,因为我并不急于加载它?!那么是否可以像通常使用

那样预先加载所需的模型
->with('user', 'books', 'etc...')

??

也可以像 $meetings = $query->paginate(5); 那样对其进行分页并执行 $meetings->withPath('home');

编辑: 找到解决方案:

// Do your query stuff
 // Get count before the query because it won't work with skip and take     parameter
    $count = $query->count();

    $query->skip($skip);
    $query->take($meetingsPerPage);
    $meetings = Meeting::fromQuery($query->toSql());
    $meetings->load('user', 'interest.image', 'img_thumbnail');
    $meetings = new LengthAwarePaginator($meetings, $count, $meetingsPerPage);

$meetings->load 相当于 ->with()。 作为最后一步,您需要创建一个分页器。重要提示:在设置 skip() and/or take() 之前使用 query->count() 否则它将不起作用。

来自 laracasts 的原始答案。还有另一个可能的说法对我不起作用。

我的解决方案:

// Do your query stuff
// Get count before the query because it won't work with skip and take parameter
$count = $query->count();

$query->skip($skip);
$query->take($meetingsPerPage);
$meetings = Meeting::fromQuery($query->toSql());
$meetings->load('user', 'interest.image', 'img_thumbnail');
$meetings = new LengthAwarePaginator($meetings, $count, $meetingsPerPage);

$meetings->load 相当于 ->with()。作为最后一步,您需要创建一个分页器。重要提示:在设置 skip() and/or take() 之前使用 query->count() 否则它将不起作用。

来自 laracasts 的原始答案。还有另一个可能的说法对我不起作用。

您可以将 setCollection() 函数与 LengthAwarePaginator 对象(在 Illuminate/Pagination/AbstractPaginator.php 中找到)一起使用。使用 load() 进行预加载。

 $users = DB::table('users')->paginate();
 $users->setCollection(User::hydrate($users->items())->load(['category']));