Laravel: 使用不同 Wheres 多次查询

Laravel: Using Query Multiple Times with different Wheres

为了提高效率,我一直在努力解决这个问题。从逻辑上讲,这应该有效。但是,一旦我调用 count() 或 get(),第二种用法就不起作用了。看到下面的代码就明白了:

$query = Address::where('area_id',$area->id);
if($order === 'house_no')
    $query->orderBy('house_no','ASC');
$query->join('members as m','addresses.member_id','=','m.id');
if($order === 'reg')
    $query->orderBy('batch','ASC')->orderBy('reg','ASC');
if($types != '')
    $query->whereIn('m.type', explode(',', $types));

$male = $query->where('m.gender','male')->get();
$female = $query->where('m.gender','female')->get(); //this does not work

如您所见,在 $male$female 中调用 $query 变量在逻辑上应该是可行的。但是我只得到第一次调用的结果,似乎一旦 count()get() 被调用, $query 变量就不再做任何其他事情了。

我也曾尝试将 $query 存储到这两个集合的两个不同变量中,但结果相同。

有什么建议吗?

我可以做同样的事情两次,但效率很低(我认为)。

提前致谢!

clone应该可以。否则你总是在同一个构建器实例上操作。

$maleQuery = clone $query;
$femaleQuery = clone $query;

$male = $maleQuery->where('m.gender','male')->get();
$female = $femaleQuery->where('m.gender','female')->get();

这都是关于那些 wheres 而不是 getcount - 基本上你最后一次尝试 where m.gender = male AND m.gender = female,所以它 逻辑上不应该 有效,但无效。

另外请注意,将 $query 存储在 2 个变量中没有任何作用,因为 对象通过引用传递 ,所以尽管对 $varOne 和 [=17 进行操作=] 你仍然使用相同的对象:

$query = Address::query();
// add your clauses
$male = $query;
$female = $query;

$male === $female; // true

// but
$male = $query;
$female = clone $query;
$male === $female; // false - 2 different objects

// now you can add last where
$males   = $male->where('m.gender', 'male')->get();
$females = $female->where('m.gender', 'female')->get();

只需 clone 使用 where('m.gender..) 之前的查询就可以了。