Laravel查询搜索行为异常

m528fe3b  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(149)

我有一些问题与查询搜索张贴到一个表前端。我承认我并不是一个laravel的Maven,我只用了3个月左右的时间。
下面是我遇到麻烦的代码:

$orders = Order::whereNot('status', 'pending')->has('items')->orderBy('updated_at', "desc");
  $ordersUsers = $orders;
  $ordersCourses = $orders;
  $ordersRegattas = $orders;
        
  if($request->input('s')){
      $ordersUsers = $ordersUsers->whereHas('user',function($query) use ($request){
          $query->where('first_name', 'LIKE', '%'.$request->input('s').'%')
          ->orWhere('last_name','LIKE', '%' .$request->input('s') . '%')->orWhere(
              DB::raw("concat(first_name, ' ', last_name)"), 'LIKE', '%' 
              .$request->input('s') . '%');
      });

      $ordersCourses = $ordersCourses->whereHas('items', function($query2) use ($request) {
          $query2->where('type', 'App\Models\Course')->whereHas('courseSubscription',
          function($query2) use ($request){               
              $query2->whereState(CourseSubscription::SUBSCRIPTION_COMPLETED)
              ->whereHas('attendees', function($query2) use ($request) {
                  $query2->where('name', 'LIKE', '%' .$request->input('s') .'%')
                  ->orWhere('surname','LIKE', '%' .$request->input('s') . '%')->orWhere(
                       DB::raw("concat(name, ' ', surname)"), 'LIKE', '%' .$request->input('s') .  
                       '%');
               });
           });
       });
       $ordersRegattas = $ordersRegattas->whereHas('items', function($query3) use ($request) {
           $query3->whereType('App\Models\Regatta')->whereHas('regattaSubscription',  
           function($query3) use ($request){
               $query3->whereHas('regattaattendees', function($query3) use ($request) {
                    $query3->where(function($query3) use ($request) {
                        $query3->where('is_owner', 1)->where('owner_partecipate',   
                        1)->where('name', 'LIKE', '%' .$request->input('s') .   
                        '%')->orWhere('surname','LIKE', '%' .$request->input('s') . 
                        '%')->orWhere(
                                DB::raw("concat(name, ' ', surname)"), 'LIKE', '%' 
                        .$request->input('s') . '%');
                    })->orWhere(function($query3) use ($request) {
                        $query3->where('is_owner', 0)->where('owner_partecipate', 0)
                        ->where('name', 'LIKE', '%' .$request->input('s') . '%')
                        ->orWhere('surname','LIKE', '%' .$request->input('s') . '%')->orWhere(
                            DB::raw("concat(name, ' ', surname)"), 'LIKE', '%'  
                            .$request->input('s') . '%');
                    });
                });
            });
        });
        $orders = $ordersRegattas;
    }
    $orders = $orders->paginate(20);
    return view('society.orders.index', compact('orders'));

涉及的模型结构:

  • 订单有多个OrderItems(items),hasMany关系和一个user,hasOne关系
  • OrderItem具有类型,在本例中为regatta/course,以及相对订阅类型(regattaSubscription和courseSubscription)
  • 这些subs有带名字/姓氏的与会者,在赛船会与会者的情况下,还有另一层条件,“is_owner”和“owner_partecipates”需要同时为0或1才能被考虑。
    基本上我应该检索订单的用户名/姓氏是等于输入,或其订阅与会者有该名称/姓氏组合
    在我的旧代码中,我将所有三个查询绑定在一个大规模的“orWhere”查询中,它工作了,然后突然停止了,因为它开始返回违反第一个条件集的订单,whereNot('status','pending')->has('items')
    我想我一定是记错了,我把orWhere命令搞砸了,我决定把它们分成三个查询,然后把结果合并到前端的表中。
    这就是我的问题所在:如果我注解掉3个查询中的2个,那么剩下的最后一个可以工作,但是如果所有三个都是活动的,那么要么$order列表为空,要么它返回第一个查询的结果,即使没有调用(在本例中,此代码返回$ordersUsers的订单)
    我试着给每个变量一个唯一的$query变量,以防它们在某种程度上发生冲突,但没有用。
    我试着查找一些文档,但找不到任何类似的东西,是我错过了什么,还是这不是预期的行为?
    旧代码供参考:
$orders = Order::whereNot('status', 'pending')->has('items')->orderBy('updated_at', "desc");
    
    if($request->input('s')){
        $orders = $orders->whereHas('user',function($query) use ($request){
            return $query->where('first_name', 'LIKE', '%' .$request->input('s') . '%')->orWhere('last_name','LIKE', '%' .$request->input('s') . '%')->orWhere(
                DB::raw("concat(first_name, ' ', last_name)"), 'LIKE', '%' .$request->input('s') . '%'
            );;
        })->orWhereHas('items', function($query) use ($request) {
            return $query->whereType('App\Models\Course')->whereHas('courseSubscription', function($query) use ($request){
                return $query->whereState(CourseSubscription::SUBSCRIPTION_COMPLETED)->whereHas('attendees', function($query) use ($request) {
                    return $query->where('name', 'LIKE', '%' .$request->input('s') . '%')->orWhere('surname','LIKE', '%' .$request->input('s') . '%')->orWhere(
                        DB::raw("concat(name, ' ', surname)"), 'LIKE', '%' .$request->input('s') . '%'
                    );
                });
            });
        })->orWhereHas('items', function($query) use ($request) {
            return $query->whereType('App\Models\Regatta')->whereHas('regattaSubscription', function($query) use ($request){
                return $query->whereState(RegattaSubscription::SUBSCRIPTION_COMPLETED)->whereHas('regattaattendees', function($query) use ($request) {
                    return $query->where(function($query) use ($request) {
                        return $query->where('is_owner', 1)->where('owner_partecipate', 1)->where('name', 'LIKE', '%' .$request->input('s') . '%')->orWhere('surname','LIKE', '%' .$request->input('s') . '%')->orWhere(
                            DB::raw("concat(name, ' ', surname)"), 'LIKE', '%' .$request->input('s') . '%'
                        );
                    })->orWhere(function($query) use ($request) {
                        return $query->where('is_owner', 0)->where('owner_partecipate', 0)->where('name', 'LIKE', '%' .$request->input('s') . '%')->orWhere('surname','LIKE', '%' .$request->input('s') . '%')->orWhere(
                            DB::raw("concat(name, ' ', surname)"), 'LIKE', '%' .$request->input('s') . '%'
                        );
                    });
                });
            });
        });
    }
    $orders = $orders->paginate(20)->withQueryString();
    return view('society.orders.index', compact('orders'));
7eumitmz

7eumitmz1#

$orders、$ordersUsers、$ordersCourses、$ordersRegattas都在访问服务器的同一内存位置。你应该

$ordersUsers = clone $orders;
$ordersCourses = clone $orders;
$ordersRegattas = clone $orders;

最后根据普通查询进行排序,
我的意见是

$orders = Order::query();
  $ordersUsers = clone $orders;
  $ordersCourses = clone $orders;
  $ordersRegattas = clone $orders;
  if($request->input('s')){
   .................
   .................
   .................

  }

  $orders->whereNot('status', 'pending')->has('items')->orderBy('updated_at', "desc")->$paginate(20);

相关问题