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
而不是 get
或 count
- 基本上你最后一次尝试 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..)
之前的查询就可以了。
为了提高效率,我一直在努力解决这个问题。从逻辑上讲,这应该有效。但是,一旦我调用 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
而不是 get
或 count
- 基本上你最后一次尝试 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..)
之前的查询就可以了。