我具有以下查询范围,该查询范围将返回可能存储在容器内的键(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()
进行检查然后有条件地返回,但是如果它们确实存在,那么我要进行两个查询-似乎很草率。
答案 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']);
}
开放供输入-谢谢。