我有一些问题与查询搜索张贴到一个表前端。我承认我并不是一个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'));
1条答案
按热度按时间7eumitmz1#
$orders、$ordersUsers、$ordersCourses、$ordersRegattas都在访问服务器的同一内存位置。你应该
最后根据普通查询进行排序,
我的意见是