在雄辩的查询范围内,当可为空的列值为null时,返回一个空的JSON对象

时间:2019-05-23 14:20:24

标签: php laravel laravel-5 eloquent laravel-5.8

我具有以下查询范围,该查询范围将返回可能存储在容器内的键(JSON):

public function scopeKeys($query, $container)
{
    return $query->select('keys')
        ->whereNotNull('keys')
        ->where('name', $container)
        ->value('keys');
}

...在我的控制器中,我通过以下方式访问此文件:

Containers::keys($container);

当键存在时,我会按预期将它们取回;然而;当keys字段为空时,出现以下错误:

  

Illuminate \ Database \ Eloquent \ Builder类的对象无法转换为字符串

我想避免使用firstOrFail(),因为我不想抛出404,我想返回一个空的JSON对象。

我确定我可以利用->exists()进行检查然后有条件地返回,但是如果它们确实存在,那么我要进行两个查询-似乎很草率。

2 个答案:

答案 0 :(得分:0)

作用域并不是为了执行查询而准备的。

您可以在范围之外执行查询:

public function scopeKeys($query, $container)
{
    return $query->select('keys')
        ->whereNotNull('keys')
        ->where('name', $container);
}

$keys = Containers::keys($container)->value('keys');

或者您定义“常规”静态方法:

public static function keys($container)
{
    return static::query()->select('keys')
        ->whereNotNull('keys')
        ->where('name', $container)
        ->value('keys');
}

$keys = Containers::keys($container);

答案 1 :(得分:0)

这似乎符合要求:

public function scopeKeys($query, $container)
{
    $query = $query->select('keys')
        ->whereNotNull('keys')
        ->where('name', $container)
        ->first();

    if (is_null($keys)) {
        return json_encode((object) null);
    }
    return $query->keys;
}

...并允许我保持控制器清洁:

public function index($container)
{
    $rsp = Containers::keys($container);

    return response($rsp)
        ->withHeaders(['Content-Type' => 'text/json']);
}

开放供输入-谢谢。