我有一个雄辩的查询,我将一些表连接在一起,然后对该查询应用不同的过滤器,但是经过一个过滤器后,原始子查询被其他过滤器中的第一个过滤器修改了。
这是原始查询:
size_t len = strlen (line);
if (len && len - 1 == '\n')
line[--len] = 0; /* trim \n from end of line */
然后应用不同的过滤器
$circle = DB::table('circles')
->joinSub($member, 'member', function ($join) {
$join->on('circles.id', '=', 'member.circle_id');
})->joinSub($place, 'place', function ($join) {
$join->on('circles.place_id', '=', 'place.placeID');
})->joinSub($dep, 'dep', function ($join) {
$join->on('department_id', '=', 'depID');
})->where('use_classification', UseClassificationEnum::USES)
->select('id', 'circle_name', 'circle_code', 'department_name', 'place_name', 'numMem', 'leader');
在$current_circle = session('circle.id');
$circle_active = $circle->where('id', $current_circle)->first();
$circle_other = $circle->where('id', '<>', $current_circle)->get();
查询中,$circle_other
中包含了原始$circle
,因此没有任何结果。
如果我按相反的顺序放置where('id', $current_circle)
和$circle_active
,则后者将不会产生任何结果。
我不想重复查询只是为了应用不同的过滤器。 我哪里做错了?请帮忙。
答案 0 :(得分:0)
基于我对Github的Laravel Query Builder来源的理解。
where()
在您的$circle
查询的$circle_active
实例中建立查询,因此反映在$circle_other
中。
在这种情况下,您可以做的就是创建一个这样的助手。
public static function buildCircleQuery() {
return DB::table('circles')
->joinSub($member, 'member', function ($join) {
$join->on('circles.id', '=', 'member.circle_id');
})->joinSub($place, 'place', function ($join) {
$join->on('circles.place_id', '=', 'place.placeID');
})->joinSub($dep, 'dep', function ($join) {
$join->on('department_id', '=', 'depID');
})->where('use_classification', UseClassificationEnum::USES)
->select('id', 'circle_name', 'circle_code', 'department_name',
'place_name', 'numMem', 'leader');
}
那你就可以做到
// Note that Helper:: is based on your helper class name
$circle_active = Helper::buildCircleQuery()->where('id', $current_circle)->first();
$circle_other = Helper::buildCircleQuery()->where('id', '<>', $current_circle)->get();