laravel hydraRaw/fromQuery 和分页急切加载
Posted
技术标签:
【中文标题】laravel hydraRaw/fromQuery 和分页急切加载【英文标题】:laravel hydrateRaw/fromQuery and eager loading with pagination 【发布时间】:2017-11-30 18:07:36 【问题描述】:我目前发现您可以对 Raw 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());
在刀片视图中,我需要从不同的表中获取一些额外的数据,例如:
$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()
和/或take()
之前使用query->count()
,否则它将不起作用。
来自laracasts的原始答案。还有另一个可能对我不起作用的说法。
【问题讨论】:
您找到解决方案了吗?很好的问题 我在另一个论坛上提问,得到了这部分答案link 编辑了我原来的帖子 @Ronon 你不知道这救了我多少挫折 @Ronon 如果您将答案添加为实际答案并将其标记为已接受而不是在问题中提供答案会更好。见self answer documentation。谢谢。 【参考方案1】:我的解决方案:
// 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()
和/或take()
之前使用query->count()
否则将不起作用。
来自laracasts的原始答案。还有另一个可能对我不起作用的说法。
【讨论】:
Awsm! Eloquent 集合“load()”方法正是我想要的!【参考方案2】:您可以将 setCollection() 函数与 LengthAwarePaginator 对象(在 Illuminate/Pagination/AbstractPaginator.php 中找到)一起使用。使用 load() 进行急切加载。
$users = DB::table('users')->paginate();
$users->setCollection(User::hydrate($users->items())->load(['category']));
【讨论】:
以上是关于laravel hydraRaw/fromQuery 和分页急切加载的主要内容,如果未能解决你的问题,请参考以下文章