【问题标题】:Returning an empty JSON object when a nullable column value is null within an eloquent query scope当可空列值在 eloquent 查询范围内为空时,返回一个空 JSON 对象
【发布时间】:2019-10-10 03:38:24
【问题描述】:

我有以下查询范围,它将返回可能存储在容器内的键 (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() 进行检查,然后有条件地返回,但是如果它们确实存在,我会进行两个查询 - 看起来很草率。

【问题讨论】:

  • firstOrFail 和 try/catch 怎么样?并在 catch 块中返回空 JSON。
  • 也检查 firstOr() ?
  • 看起来问题不在范围查询中。 value 方法只能返回 null 或传递的列值。请显示完整的代码和异常跟踪。
  • 我在 Tinker 中检查了您的查询,当没有任何匹配项时,它会返回 null,它不会引发任何错误。您如何在控制器中处理此方法的响应?
  • 公共函数索引($container) { $rsp = Containers::keys($container);返回响应($rsp) ->withHeaders(['Content-Type' => 'text/json']); }

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


【解决方案1】:

作用域并不意味着执行查询,只是为了准备它们。

可以在范围外执行查询:

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);

【讨论】:

    【解决方案2】:

    这似乎符合要求:

    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']);
    }
    

    开放输入 - 谢谢大家。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 2019-09-05
      相关资源
      最近更新 更多