首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel - mysql ()和Seed

Laravel - mysql ()和Seed
EN

Stack Overflow用户
提问于 2019-06-18 11:18:20
回答 2查看 306关注 0票数 0

我几乎要放弃了,因为我已经坚持了很长一段时间了。希望你能帮我个忙。

目标

我想在无限滚动中返回一个分页缓存的查询。我使用Ajax从视图中调用Controller,并获取"nextPageUrl()“并将其保存在我的视图中。

问题

我的查询返回内部数组的随机顺序(也在第一级排序),这是很好的。但是每次我进行ajax调用时,这个查询都会运行。所以我想:嘿,让我们缓存它,这样每次我进行ajax调用时都有相同的查询,而且我没有重复的查询。但是每次ajax请求都会出现副本。

我尝试了什么:

下面是我的查询,它被缓存并分页:

代码语言:javascript
复制
$counter = $request->page;

$results = Cache::remember($counter, 1, function () {
    $seed = rand(1,9999);

    return Ad::where('status', 1)
        ->whereIn('ad_type', [0, 1, 2, 3])
        ->where('expire_at', '>', date('Y-m-d H:i:s'))
        ->where('special_ad', 'standard_ad')
        ->orderByRaw(DB::raw("FIELD(ad_type,2,1,3,0)"))
        ->inRandomOrder()
        ->paginate(15);
});


if($request->ajax()) {
    return [
        'ads' => view('partials.advanced_search_sidebar2')->with(compact('results','index'))->render(),
        'next_page' => $results->nextPageUrl(),
    ];
} else {
    return view("welcome_live", compact('results', 'usertypes'));
}

inRandomOrder();方法与orderByRaw("RAND()")方法等价。

不幸的是,我发现了以下不适合我的方法:Laravel随机分页缓存

我不想写太多,因为如果您需要对代码进行更彻底的解释,或者需要更多的代码片段或我的“解释的处理方法”,请告诉我,这里有一堵代码墙可能会让人感到困惑。提前感谢您的支持。你好,德索里。

编辑::我尝试使用$seed作为inRandomOrder($seed)中的一个参数,但是这会一次又一次地返回相同的查询,尽管种子是不同的。

有点接近解决方案,我尝试使用固定的$seed值,在我的例子中,我输入了25,所以种子总是25,不再重复,很好,但是顺序现在总是一样的。我基本上觉得我可以在随机排序和重复排序之间做出选择,也可以选择拥有相同的顺序,但没有重复。

我的Ajax函数

代码语言:javascript
复制
function renderBase() {
    var page = $('.suchergebnisWrapper').data("base");
    var counter = $('.suchergebnisWrapper').data("counter");


    if (counter < 10) {
        $.ajax({
            url: page,
            type: 'GET',
            data: {
            },
            headers: {
                'X-CSRF-Token': '{{ csrf_token() }}',
            },
        }).done(
            function (responseData) {
                $('.resultwrapper').append(responseData.ads);
                $('.suchergebnisWrapper').data('base', responseData.next_page);

            });
    }

}

这可能会让人感到困惑,因为在Controller中,我使用的是“计数器”和javascript,但这只是为了每次缓存中都有一个不同的“键”。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-18 12:19:30

distinct()可以给您提供不重复的数据,您应该像在其中传递id那样传递属性

代码语言:javascript
复制
return Ad::where('status', 1)
    ->whereIn('ad_type', [0, 1, 2, 3])
    ->where('expire_at', '>', date('Y-m-d H:i:s'))
    ->where('special_ad', 'standard_ad')
    ->orderByRaw(DB::raw("FIELD(ad_type,2,1,3,0)"))
    ->inRandomOrder()
    ->distinct()
    ->paginate(15);
票数 0
EN

Stack Overflow用户

发布于 2019-06-18 11:47:24

在$计数器->追加(输入::除了(‘page’))之后尝试这样做;

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56647920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档