繁体   English   中英

有没有办法根据条件通过单个查询获得两个不同的结果?

[英]Is there any way to get two different results with single query based on condition?

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

例如

$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 查询时,我看到 $topSellingMailUsers 中应用的 new_mail 和 top sell_mail 的条件查询我想要的是它不应该在查询中考虑邮件条件。

如何分别根据这两个条件获得 $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 Illuminate\Database\Eloquent\Builder */
$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');

这样,它将返回具有所有角色的用户,或者如果 ->when(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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM