【问题标题】:Laravel query builder. Column if not null = 1 else = 0 in select methodLaravel 查询生成器。列 if not null = 1 else = 0 在 select 方法中
【发布时间】:2020-04-25 05:19:54
【问题描述】:

我使用 Laravel 及其 \Illuminate\Database\Eloquent\Builder。我想从“table_1”中选择所有列,其中包含自定义列“is_table_2_present”,其值将是 1 或 0,具体取决于 if(table_1_id != null)。

所以我想做这样的事情。

$queryBuilder->leftJoin("table_2"....)

$queryBuilder->select([
    "table_1.*",
    "is_table_2_present" = (table_2_id != null) ? 1 : 0,
]);

我试图寻找答案,但没有成功。所以我想问一下这样的事情是否可能?

我不能使用 Eloquent 关系的原因是因为我需要与参数的关系。这在 laravel 5.2 中是不可能的,对吧?

public function table_2($userId)
{
    return $this->hasOne(Table_2::class....)->where(user_id, "=", userId);
}

【问题讨论】:

  • 您可能有正当理由执行此原始查询,但您是否有理由不使用 Eloquent 关系?
  • 我使用遗留代码,有点需要这样做。所以你的建议只是使用->selectRaw()?
  • @Spholt 我编辑了问题来解释为什么我不能使用 Eloquent 关系

标签: sql laravel laravel-query-builder


【解决方案1】:

从概念上讲,每个表都与一个模型相关联。尝试在您尝试查询的两个表的模型之间建立雄辩的关系。

【讨论】:

  • 我正在使用遗留代码,并且在这种情况下需要在没有 Eloquent 关系的情况下这样做
  • 或者可以用参数laravel 5.2创建关系吗?
【解决方案2】:

你可以使用selectRaw(),我想会是:

$queryBuilder->selectRaw(
             <<<EOT
               table_1.*,
               if(table_2_id != ?, 1, 0) as is_table_2_present, 
             EOT,
             [null]
             );

在上面的代码中,我使用绑定来避免 SQL 注入。

【讨论】:

    【解决方案3】:

    由于这个问题有点死,暂时没有回应我现在用 selectRaw() 解决了它。但仍在寻找更简洁的解决方案。

    $queryBuilder->selectRaw("
        table_one.*,
        CASE WHEN table_two.id IS NOT NULL THEN 1 ELSE 0 END AS tableTwoPresent
    ");
    

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 2015-08-06
      相关资源
      最近更新 更多