【问题标题】:Laravel query: Different where clauses for each selectLaravel查询:每个选择的不同where子句
【发布时间】:2014-09-29 13:23:08
【问题描述】:

我想知道,是否有办法为每个选择声明不同的 where 子句。

这是我想要做的:我的数据库如下所示:

“可见...”列指示是否要读出相关值。所以如果“visible_mobile”说“0”,我不想读出“mobile”列。

当然,我可以通过执行多个查询来做到这一点,例如:

$userDetails1 = DB::table('user')
 ->select('mobile', 'id')
 ->where('user_id',  5)
 ->where('visible_mobile',  1)
 ->get();

$userDetails2 = DB::table('user')
 ->select('date_of_birth', 'id')
 ->where('user_id',  5)
 ->where('visible_date_of_birth',  1)
 ->get();

但我想知道我是否可以只用一个查询来做到这一点?

编辑:我试图得到的输出应该看起来像这样链接:

【问题讨论】:

  • 你能给我画一张表(带有列标题),显示你想要的这个组合查询的示例输出吗?
  • 我在我的问题中添加了一个示例。
  • 你为什么要追求不必要的复杂性?如果设置了标志,为什么不直接询问所有数据并使用它呢? (可以通过多个查询或复杂查询来完成,如果可见为 0,则返回 NULL)

标签: mysql sql laravel query-builder


【解决方案1】:

将 selectRaw() 与 MySQL 的 IF 函数一起使用,您可以执行以下操作:

$userDetails = DB::table('user')
 ->selectRaw('id, user_id, IF(visible_date_of_birth = 1, date_of_birth, NULL) as dob, IF(visible_mobile = 1, mobile, NULL) as mob')
 ->where('user_id',  5)
 ->get();

由于您将 laravel 与 Eloquent 一起使用,因此实现此目的的更好方法是在模型上为您的移动和出生日期字段定义一个访问器,如下所示:

function getMobileAttribute()
{
    if($this->visible_mobile == 1){
        return $this->mobile;
    } else {
        return NULL;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 2019-10-25
    • 1970-01-01
    • 2021-09-18
    • 2020-08-18
    • 2013-09-04
    相关资源
    最近更新 更多