ajax请求在laravel中使用多个数据

时间:2019-03-15 02:51:38

标签: php ajax laravel

我正在使用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. 为什么当我向我的Ajax请求中添加第二个compact时,它停止运行?
  2. 我该如何解决? (我稍后将需要在此功能中添加更紧凑的版本)

谢谢。

1 个答案:

答案 0 :(得分:0)

检查一下。

  

问题是当我有第二个表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'));
}

请参阅您的第二个请求传递此文本if ($request->ajax()) { return ...}-由于此代码上方的ia永远不会到达新代码,因为它会以这种状态返回。明确地说,您说这两个请求都是AJAX,所以在这种情况下就是这样。

您应该发送另一种数据,例如模式,可以用来打开操作。或其他一些方法来区分它们。

PS-我不使用Laravel,所以我不知道Laravel批准的方式来做,但这应该很简单。

更新

我将进一步解释。

现在请理解,这些请求来自何处,它们应该做什么或所遵循的顺序并不重要。唯一重要的是,它们为它们两个都调用相同的代码,并且都是两个AJAX请求。

第一个请求


因此,让我们逐步进行第一个操作:

  1. 您发送第一个AJAX请求
  2. 它运行上面的代码,在第一个条件if($request->ajax())或用英语询问:“此请求是AJAX请求吗?”我们说的是。这样就可以了
  3. 代码为此分配-$view = (String) view('front.pages.test',compact('jobs', 'portfolios'));
  4. 我们返回响应return response()->json(['html'=>$view]); //<--- return,由于返回而退出了该响应(无论“ it”是什么),并且#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,由于返回而退出了该响应(无论“ it”是什么),并且#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的“职位”。
    • 如果以上条件为FALSE,则我们命中了第三个}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请求时,我们现在将满足所有内部条件,即您所说的。正如我在本练习开始时提到的那样,这些操作做什么或它们处于什么顺序都无关紧要。这里也是如此。就像我在第二个请求部分中所做的一样。

如果您再次提出请求(针对此新代码),则该请求的运行将与此处的第一个请求完全相同,在解决方案部分中完成。

基本上,无论哪种情况,代码都不关心它们的来源,它将每个请求视为一个新请求。 HTTP是无状态的,这就是为什么我们需要Cookies和Databases等。 (原始代码和新内容之间的区别)是此处(新内容中)的第二个请求可以访问所有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中使用的方式,就应该执行这些新调用。不管它们是否有效,我都不知道。但是,我想您会发现的。

我真的希望这是有道理的,因为您的评论确实没有。

  

现在,当我尝试使用相同的文件并请求但这次用于另一个表时,它将停止工作

它停止工作的原因是您发送具有不同结构的Table2数据。如果它是不同的表,则列可能会不同,数据也将有所不同,等等。。。但是,尽管您运行的是第一个或原始表的代码,但您正在运行它。

我真的不知道该怎么说。可能还存在其他问题,但这至少将允许它运行您的代码。

干杯!