Laravel - Paginate с mysql Rand () и Семенем - PullRequest
1 голос
/ 18 июня 2019

Я так близок к тому, чтобы сдаться, потому что я застрял в этом довольно долго. Я надеюсь, что вы можете помочь мне.

Цель

Я хочу вернуть , разбитый на страницы и кэшированный, запрос в бесконечной прокрутке. Я использую Ajax, чтобы совершать вызовы из View в Controller, получать «nextPageUrl ()» и сохранять его в моем представлении.

Проблема

Мой запрос возвращает рандомизированный порядок внутренних массивов (которые также сортируются на первом уровне), и это здорово. Но запрос выполняется каждый раз, когда я делаю вызов ajax, тоже. Итак, я подумал: эй, давайте кешируем его, чтобы у меня был один и тот же запрос каждый раз, когда я делаю вызов ajax, и у меня больше нет дубликатов. Но дубликаты появляются при каждом запросе ajax, который я делаю ..

Что я пробовал:

Вот мой запрос, который кэшируется и разбивается на страницы:

$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

Я не хочу писать слишком много, потому что это может ввести в заблуждение наличие здесь стены кода, если вам нужно более подробное объяснение кода или еще несколько фрагментов кода или мой "способ обработки объясненных вещей", пожалуйста, дайте мне я знаю. Спасибо заранее за вашу поддержку. С уважением, Десори.

Edit :: Я пытался использовать $ seed в качестве аргумента в inRandomOrder ($ seed), но это возвращало один и тот же запрос снова и снова, хотя seed был другим.

Несколько ближе к решению Я попытался использовать фиксированное значение $ seed, в моем случае я просто набрал 25 так что семя всегда 25, дубликатов больше нет, отлично, но теперь порядок всегда тот же. Я в основном чувствую, что могу выбирать между случайным порядком и дубликатами и одинаковым порядком, но без дубликатов.

Моя функция Ajax

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);

            });
    }

}

Это может показаться странным, потому что в контроллере я использую "counter" и в javascript, но это просто для того, чтобы каждый раз иметь разные "ключи" в моем кэше.

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

different () может дать вам не дублирование данных, вы должны передать атрибут как id в нем

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 голосов
/ 18 июня 2019

попробуйте это после $ counters-> append (Input :: Кроме ('страницы'));

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...