Возврат пустого объекта JSON, когда значение столбца, допускающего значение NULL, равно нулю в пределах объема красноречивого запроса - PullRequest
0 голосов
/ 23 мая 2019

У меня есть следующая область запроса, которая возвращает ключи (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 голосов
/ 23 мая 2019

Это, кажется, соответствует требованиям:

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

Открыт для ввода - спасибо всем.

0 голосов
/ 23 мая 2019

Области предназначены не для выполнения запросов, а только для их подготовки.

Вы можете выполнить запрос вне области действия:

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