Laravel口才:当()在JSONB列上时

3duebb1j  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(146)

我想我不明白when()的正确用法。
我试着用这种方式来表达:我有一个jsonb列(称为info),它有多个属性。我想检查其中一个值是否为“Chemical”,并执行一些查询。否则,执行另一个查询。这是我使用它的方式:

$query->when(
    'info->type' === 'Chemical',
    function ($query) {
        return $query->has('bottles', 0);
    },
    function ($query) {
        return $query->where('info->quantity', '<=', 0);
    }
);

第一个函数将是truthy值,第二个函数将是falsey值。然而,它永远不会命中第一个函数。
我做错了什么?你不是这样使用when的吗?

wbgh16ku

wbgh16ku1#

您是正确的,唯一的错误是info->type永远不会等于Chemical,因为您正在比较字符串。
因此,无论您将表达式写为什么,它都必须是与查询无关的内容。
when作为if的别名工作,因此不需要像这样中断查询:

$query = Model::query();

if ($expression) {
    $query->where('column_a', 1);
} else {
    $query->where('column_a', 0);
}

$query->where('whatever', 123);

if ($expression2) {
    $query->where('abc', 1);
}

使用when,它将如下所示:

$query = Model::query()
    ->when(
        $expression,
        fn (Builder $query) => $query->where('column_a', 1),
        fn (Builder $query) => $query->where('column_a', 0),
    )
    ->when(
        $expression2,
        fn (Builder $query) => $query->where('abc', 1)
    );

按照您的示例,您需要获得info->type是什么,假设您能够从另一个器件获得:

$infoType = 'value';

$query = Model::query()
    ->when(
        $infoType === 'Chemical',
        function ($query) {
            return $query->has('bottles', 0);
        },
        function ($query) {
            return $query->where('info->quantity', '<=', 0);
        }
    );

有关when的更多信息,请参阅文档。
您可以阅读更多,只需检查when()的源代码(Laravel 9)

相关问题