ajax-запрос для нескольких данных в laravel - PullRequest
0 голосов
/ 15 марта 2019

Я получаю свои данные с помощью load more button, и все работает нормально, проблема в том, что у меня запрос Ajax ко второй таблице не выполняется.

Пример

controller

$jobs = Job::where('status', '1')->orderby('id', 'desc')->paginate(5);
if ($request->ajax()) {
  $view = (String) view('front.pages.test',compact('jobs', 'portfolios'));
  return response()->json(['html'=>$view]);
}
return view('front.pages.job', compact('page', 'jobs'));

Приведенный выше код загружает мои задания на странице 2,3,4,etc. с помощью load more button, и он работает.

Теперь , когдаЯ пытаюсь использовать тот же файл и запрос, но на этот раз для другой таблицы он перестает работать:

controller

$jobs = Job::where('status', '1')->orderby('id', 'desc')->paginate(5);
$portfolios = Portfolio::orderby('id', 'desc')->where('status', '1')->paginate(4);

if ($request->ajax()) {
  $view = (String) view('front.pages.test',compact('jobs', 'portfolios'));
  return response()->json(['html'=>$view]);
}

if($page->template == 'portfolio'){
  return view('front.pages.portfolio', compact('page', 'portfolios'));
} elseif($page->template == 'job'){
  return view('front.pages.job', compact('page', 'jobs'));
}

и тогда мой front.pages.test выглядит так:

@if(isset($jobs))
  @foreach($jobs as $job)
    html of my jobs style etc....
  @endforeach
@elseif(isset($portfolios))
  @foreach($portfolios as $portfolio)
    html of my portfolios style etc....
  @endforeach
@endif

Вопрос

  1. Почему, когда я добавляю второй compact в мой Ajax-запрос, он перестает работать?
  2. Как это исправить?(Мне нужно добавить более компактный в этой функции позже)

Спасибо.

1 Ответ

0 голосов
/ 15 марта 2019

Проверьте это.

проблема в том, что у меня есть запрос Ajax ко второй таблице, он не будет выполнен.

if ($request->ajax()) { //<-- second request is ajax is it not?
    $view = (String) view('front.pages.test',compact('jobs', 'portfolios'));
     return response()->json(['html'=>$view]); //<--- return
}

//< --- as you said it's never executed -->
if($page->template == 'portfolio'){
  return view('front.pages.portfolio', compact('page', 'portfolios'));
 } elseif($page->template == 'job'){
  return view('front.pages.job', compact('page', 'jobs'));
}

Смотрите, как ваш второй запрос проходит этоtext if ($request->ajax()) { return ...} - Поскольку это выше вашего кода, он никогда не достигает нового кода, потому что возвращается в этом состоянии.Чтобы было ясно, вы сказали, что оба запроса были AJAX, так что именно так и происходит в этом случае.

Вам следует отправить другой фрагмент данных, подобный режиму, который вы можете использовать для включения операции.Или какой-то другой способ разграничения между ними.

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

Обновление

Я объясню это далее.

Теперь, пожалуйста, поймите, откуда поступают эти запросы, и что они должны делать или в каком порядке они находятся, на самом деле не имеет значения. только имеет значение то, что они вызывают один и тот же кусок кода для обоих из них, и они оба AJAX-запросов.

Первый запрос


Итак, давайте пройдемся по первому шагу, шаг за шагом:

  1. Вы отправляете первый запрос AJAX
  2. Он запускает приведенный выше код, Inпервое условие if($request->ajax()) или по-английски спрашивает: «Этот запрос является AJAX-запросом?»что мы и сказали.Так что проходит
  3. Код присваивает это - $view = (String) view('front.pages.test',compact('jobs', 'portfolios'));
  4. Мы возвращаем наш ответ return response()->json(['html'=>$view]); //<--- return, который выходит из этого (что бы это ни было) из-за возврата, и ни один изкод ниже # 4 работает.

Чтобы визуализировать это, я ошеломил строки ниже:

/*2*/   if ($request->ajax()) { //<-- second request is ajax is it not?
/*3*/       $view = (String) view('front.pages.test',compact('jobs', 'portfolios'));
/*4*/       return response()->json(['html'=>$view]); //<--- return
/*exit*/ }         

        //< --- as you said it's never executed -->
        if($page->template == 'portfolio'){
          return view('front.pages.portfolio', compact('page', 'portfolios'));
         } elseif($page->template == 'job'){
          return view('front.pages.job', compact('page', 'jobs'));
        }

Пока все хорошо.

Второй запрос


Теперь давайте пройдемся по второму запросу одинаково (буквально):

  1. Вы отправляете второй запрос AJAX
  2. Он запускает вышеуказанный код, в первом условииif($request->ajax()) или по-английски спрашивает: "Этот запрос является запросом AJAX?"что мы и сказали.Так что проходит
  3. Код присваивает это - $view = (String) view('front.pages.test',compact('jobs', 'portfolios'));
  4. Мы возвращаем наш ответ return response()->json(['html'=>$view]); //<--- return, который выходит из этого (что бы это ни было) из-за возврата, и ни один изкод ниже # 4 работает.

Чтобы визуализировать это, я ошеломил строки ниже:

/*2*/   if ($request->ajax()) { //<-- second request is ajax is it not?
/*3*/       $view = (String) view('front.pages.test',compact('jobs', 'portfolios'));
/*4*/       return response()->json(['html'=>$view]); //<--- return
/*exit*/ }       

        //< --- as you said it's never executed -->
        if($page->template == 'portfolio'){
          return view('front.pages.portfolio', compact('page', 'portfolios'));
         } elseif($page->template == 'job'){
          return view('front.pages.job', compact('page', 'jobs'));
        }

Выглядит знакомо?

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

Решение


Итак, что вы можете сделать, как я сказал, я не использую Laravel, поэтому у меня нет возможности узнать, сработает ли ваш новый код.Все, что я могу пройти, это несколько строк кода, которые были опубликованы, и ваше описание проблемы.Поэтому единственный способ показать вам, как это исправить, - это перестроить его.Таким образом, все, что я делаю, - это передвигаю несколько вещей.

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

if ($request->ajax()) { 
   if($page->template == 'portfolio'){
        return view('front.pages.portfolio', compact('page', 'portfolios'));
   } elseif($page->template == 'job'){
        return view('front.pages.job', compact('page', 'jobs'));
   }else{
       $view = (String) view('front.pages.test',compact('jobs', 'portfolios'));
       return response()->json(['html'=>$view]); //<--- return
   }
}

Позволяет запустить этот код:

  1. Вы делаете первый запрос
  2. Он выполняетсяновый код, в первом условии if($request->ajax()) или на английском языке он спрашивает: "этот запрос является запросом AJAX?"что мы и сказали.Итак, это проходит
  3. Теперь мы находимся в первой части внутреннего условия или в этой строке
    • if($page->template == 'portfolio'){, которая говорит, что Page Tempate равен «портфолио».Я переместил число на строку вниз по причинам «читабельности».
    • Если выше указано FALSE, мы набрали второе значение } elseif($page->template == 'job'){, как и выше, но на этот раз проверяли $page на «задание».
    • Если выше указано ЛОЖЬ, мы нажимаем на третье }else{, которое всегда верно, поэтому, если ни одно из двух других условий не выполнено, мы запускаем оригинальное условие, которое является кодом в этом блоке.*

Чтобы визуализировать это, я ошеломил строки ниже

/*2*/   if ($request->ajax()) { 
/*3*/      if($page->template == 'portfolio'){
/*3.1*/         return view('front.pages.portfolio', compact('page', 'portfolios'));
           } elseif($page->template == 'job'){
/*3.2*/         return view('front.pages.job', compact('page', 'jobs'));
           }else{
/*3.3*/         $view = (String) view('front.pages.test',compact('jobs', 'portfolios'));
                return response()->json(['html'=>$view]); //<--- return
           }
       }

Как вы можете видеть, теперь мы затронем все наши внутренние условия, когда они будут AJAX-запросами, которые, как вы сказали, являются. И, как я уже упоминал в начале этого упражнения, не имеет значения, что они делают или в каком порядке. То же самое и здесь. Также, как я делал выше, в разделе Второй запрос .

Если вы сделаете еще один запрос (против этого нового кода), он будет работать точно так же, как первый здесь, в разделе Solution .

По сути, в любом случае код не заботится о том, откуда он пришел, он обрабатывает каждый запрос как новый. HTTP не имеет состояния, поэтому нам нужны Cookies и базы данных и так далее. Разница (между исходным кодом и новым материалом) заключается в том, что второй запрос (в новом материале) имеет доступ ко всем 3, где у нас есть другой набор условий для направления нас к правильному выводу.

Так, скажем, мы запускаем выше до # 3, тогда $page в этом запросе равно job мы запускаем этот код:

 /*3.2*/   return view('front.pages.job', compact('page', 'jobs'));

Теперь скажите, что мы делаем другое, но на этот раз $page не равно job и также не равно portfolio. Ну, в этом случае мы выполняем блок else с этим кодом:

/*3.3*/   $view = (String) view('front.pages.test',compact('jobs', 'portfolios'));

И так далее для скольких запросов вы хотите сделать.

Заключение


Теперь вы должны понять, что я понятия не имею, установлена ​​ли эта вещь $page, т. Д. Но если ваш код выше, как это должно быть в Laravel, он должен выполнить эти новые вызовы. Скорее всего, они будут работать, я понятия не имею. Но, я полагаю, вы узнаете это.

Я действительно надеюсь, что это имеет смысл, потому что ваш комментарий действительно не сделал.

Теперь, когда я пытаюсь использовать тот же файл и запрос, но на этот раз для другой таблицы, он перестает работать

Причина, по которой он перестает работать, заключается в отправке данных для таблицы 2 с другой структурой. Вероятно, столбцы различны, если это другая таблица, данные тоже разные и т. Д. Но вы выполняете это, хотя код для первой или исходной таблицы у вас был.

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

Ура!

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