【问题标题】:Laravel DB::raw query using multiple WHERE clauses使用多个 WHERE 子句的 Laravel DB::raw 查询
【发布时间】:2020-06-10 07:16:30
【问题描述】:

所以我有一个查询,我想添加一些额外的条件。

查询:

$providers = BusinessDetail::select(
    'business_details.name as description', 
    DB::raw('SUM(review_details.param_value) / COUNT(review_headers.id) AS avgUserReview')
)
->leftJoin('review_headers', 'business_details.id', '=', 'review_headers.business_detail_id')
->leftJoin('review_details', 'review_headers.id', '=', 'review_details.review_header_id')
->leftJoin('rate_params', 'review_details.rate_param_id', '=', 'rate_params.id')
->groupBy('business_details.id')
->get();

我想单独将以下内容添加到查询 DB::raw 查询 DB::raw('SUM(review_details.param_value) / COUNT(review_headers.id) AS avgUserReview')。

->whereIn('rate_params.id', [1, 3, 4, 5])
->where('review_details.param_value', '<>', NULL)
->where('review_details.param_value', '<>', '')
->where('review_headers.review_status', '=', 1)

以便查询读取 `'SUM(review_details.param_value) / COUNT(review_headers.id) 其中四个 WHERE 子句仅包含在其中。

我该怎么做?

有人吗?

【问题讨论】:

  • 不太清楚...
  • @TsaiKoga 如何将 for where 条件添加到 DB::raw('SUM(review_details.param_value) / COUNT(review_headers.id) AS avgUserReview') ?
  • 在leftjoin之后添加即可
  • @TsaiKoga 如果我将它们添加到那里,它们会影响其他人......我希望他们单独申请'SUM(review_details.param_value) / COUNT(review_headers.id) AS avgUserReview'
  • 你没有groupby,在sum()/count()之后会变成一条记录,所以添加条件还是一条记录,你只选择description和avg,不太清楚影响他人。

标签: laravel laravel-5 eloquent


【解决方案1】:

您可以使用 selectRaw 来做到这一点。

Documentation selectRaw

刚刚添加到您的原始查询中:

->selectRaw('SUM(review_details.param_value) / COUNT(review_headers.id) AS avgUserReview')
->whereIn('rate_params.id', [1, 3, 4, 5])
->where('review_details.param_value', '<>', NULL)
->where('review_details.param_value', '<>', '')
->where('review_headers.review_status', '=', 1)

【讨论】:

  • 但这会影响到其他...包括'business_details.name as description', 可以只针对'SUM(review_details.param_value) / COUNT(review_headers.id) AS avgUserReview'吗?
【解决方案2】:
->selectRaw('SUM(review_details.param_value) / COUNT(review_headers.id) AS avgUserReview')->select('business_details.name as description')->whereIn('rate_params.id', [1, 3, 4, 5])->whereNotNull('review_details.param_value')->where('review_headers.review_status', 1);

您可以使用两种选择方法或一种选择原始方法,并在其中提及您需要的尽可能多的列。正如@juancruzbarrios.job 提到的那样

->selectRaw('SUM(review_details.param_value) / COUNT(review_headers.id) AS avgUserReview , business_details.name as description')->whereIn('rate_params.id', [1, 3, 4, 5])->whereNotNull('review_details.param_value')->where('review_headers.review_status', 1)

第二件事你要为一列写两个 where 条件,可以缩短为

【讨论】:

  • 如果您不希望条件适用于其余选秀权,即 WHERE 条件应仅适用于 'SUM(review_details.param_value) / COUNT(review_headers.id) AS avgUserReview' 而不适用于其余选秀权,该怎么办。
  • 然后你使用 DB::raw('select SUM(review_details.param_value) / COUNT(review_headers.id) AS avgUserReview from review_details where conditions') 如果仍然不清楚 ping 我聊天
猜你喜欢
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2015-06-03
相关资源
最近更新 更多