是否有任何方法可以根据条件获得两个不同的结果?



我试图从单个查询中获得两个不同的结果,但问题是两个条件都适用于上次查询。

例如

$getUser = User::join('role_user','role_user.user_id','users.id')
->select('users.id','users.name','users.email','users.identity_status','users.email_verified_at','role_user.role_id')
->where('role_user.role_id',2)
->whereNotNull('users.email_verified_at');
$newMailUsers = $getUser->where('new_mail',0)->get();

$topSellingMailUsers = $getUser->where('topselling_mail',0)->get();

但是当我检查$topSellingMailUsers的sql查询时,我看到new_mail和topselling_mail的条件都应用在$topSellingMailUsers查询中,我想要的是它不应该在查询中考虑邮件条件。

我怎么能得到两个不同的结果$newMailUsers, $topSellingMailUsers分别基于这两个条件。

每次使用where()方法时,您都在改变$getUser查询生成器。

你可以用clone()方法链接你的查询生成器,这将返回另一个具有相同属性的查询生成器。

$getUser = User::join('role_user','role_user.user_id','users.id')
->select('users.id','users.name','users.email','users.identity_status','users.email_verified_at','role_user.role_id')
->where('role_user.role_id',2)
->whereNotNull('users.email_verified_at');
$newMailUsers = $getUser->clone()->where('new_mail',0)->get();

$topSellingMailUsers = $getUser->clone()->where('topselling_mail',0)->get();

您需要克隆Builder对象以重用它

$selectFields = [
'users.id', 
'users.name', 
'users.email', 
'users.identity_status', 
'users.email_verified_at', 
'role_user.role_id'
];
/** @var IlluminateDatabaseEloquentBuilder */
$getUser = User::join('role_user', 'role_user.user_id', 'users.id')
->select($selectFields)
->where('role_user.role_id', 2)
->whereNotNull('users.email_verified_at');
$newMailUsers = (clone $getUser)->where('new_mail', 0)->get();
$topSellingMailUsers = (clone $getUser)->where('topselling_mail', 0)->get();

嗯,如果你在模型上建立关系会更容易,但仍然可以做到:

// Let's say you pass sometimes the role_id
$role_id = $request->role_id ?? null;

$getUser = User::join('role_user','role_user.user_id','users.id')
->select('users.id','users.name','users.email','users.identity_status','users.email_verified_at','role_user.role_id')
// ->where('role_user.role_id',2) // replaced with ->when() method
->when($role_id, function ($query) use ($role_id){
$query->where('role_user.role_id', $role_id);
})
->whereNotNull('users.email_verified_at');

这样它将返回所有角色的用户,或者如果->当(condition为TRUE)它将返回角色id = $role_id的用户。

可以使用多个->when(condition, function(){});

玩得开心!

不需要触发多个查询,您可以在单个查询中使用集合方法,如下所示。

$users = User::join('role_user','role_user.user_id','users.id')
->select('users.id','users.name','users.email','users.identity_status','users.email_verified_at','role_user.role_id', 'new_mail', 'topselling_mail')
->where('role_user.role_id',2)
->where(function($query) {
$query->where('new_mail', 0)->orWhere('topselling_mail', 0);
})
->whereNotNull('users.email_verified_at')
->get();
$newMailUsers = $users->where('new_mail',0)->get();

$topSellingMailUsers = $user->where('topselling_mail',0)->get();

相关内容

  • 没有找到相关文章

最新更新