Laravel 可以在 column = 之间自动切换吗?和列是 NULL 取决于值?

Posted

技术标签:

【中文标题】Laravel 可以在 column = 之间自动切换吗?和列是 NULL 取决于值?【英文标题】:Can Laravel automatically switch between column = ? and column IS NULL depending on value? 【发布时间】:2021-12-17 20:56:00 【问题描述】:

在为 Laravel 构建复杂的 SQL 查询时,使用 ? 作为参数的占位符非常棒。但是,当值为 null 时,需要将 SQL 语法从 = ? 更改为 IS NULL。另外,由于参数的数量少了一个,所以我需要传递一个不同的数组。

为了让它工作,我是这样写的,但一定有更好的方法:

if ($cohortId === null) 
    // sql should be: column IS NULL
    $sqlCohortString = "IS NULL";
    $params = [
        Carbon::today()->subDays(90),
        // no cohort id here
    ];
 else 
    // sql should be: column = ?
    $sqlCohortString = "= ?";
    $params = [
        Carbon::today()->subDays(90),
        $cohortId
    ];


$query = "SELECT items.`name`,
        snapshots.`value`,
        snapshots.`taken_at`,
    FROM snapshots
    INNER JOIN (
        SELECT MAX(id) AS id, item_id
        FROM snapshots
        WHERE `taken_at` > ?
        AND snapshots.`cohort_id` $sqlCohortString
        GROUP BY item_id
    ) latest
    ON latest.`id` = snapshots.`id`
    INNER JOIN items
    ON items.`id` = snapshots.`item_id`
    ORDER by media_items.`slug` ASC
";

$chartData = DB::select($query, $params);

我的问题是:Laravel 有没有办法更智能地检测空值并替换?

PS:SQL 是针对图表的,所以我需要每个项目的单个最高快照值。

【问题讨论】:

【参考方案1】:

您可以使用->when 创建条件 where 子句:

$data = DB::table('table')
    ->when($cohortId === null, function ($query) 
        return $query->whereNull('cohort_id');
    , function ($query) use ($cohortId) 
        // the "use" keyword provides access to "outer" variables
        return $query->where('cohort_id', '=', $cohortId);
    )
    ->where('taken_at', '>', $someDate)
    ->toSql();

【讨论】:

以上是关于Laravel 可以在 column = 之间自动切换吗?和列是 NULL 取决于值?的主要内容,如果未能解决你的问题,请参考以下文章

我正在使用 laravel,我想计算控制器中存储函数中两个日期之间的天数并自动显示在索引视图中

laravel-8 whreRelation 说 Column not found: 1054 Unknown column 'relation' in 'where Clause'

Laravel Column 已经存在:1060 Duplicate column name

laravel 我需要在 unique() 列上使用 index() 吗?

laravel中的增量列

我可以在 DataGrid 表之间共享 DataGrid.Columns