Мне нужно получить информацию и вывести ее в массив, но возникают ошибки.

Ниже приведен код класса, который делает запрос get

public function getByLoja(string $uuid): array
{
    $query = HorarioLoja::all();

    $query = $query->where('loja', function ($loja) use ($uuid) {
        $loja->where('uuid', $uuid);
    });

    $horariosDaLoja = $query->get();

    $saida = [];
    foreach ($horariosDaLoja as $horario) {
        $saida[] = $this->horarioLojaTransformador->paraModelo($horario);
    }

    return $saida;
}

Ниже код модели

class HorarioLoja extends Model
{
    protected $dates = ['created_at', 'updated_at'];
    protected $table = 'horario_lojas';

    public function loja()
    {
        return $this->belongsTo(Loja::class, 'loja_id', 'id');
    }
}

Ошибка:

Слишком мало аргументов для функции Illuminate \ Support \ Collection :: get (), 0 передано в /var/www/html/code/app/Persistencia/Laravel/Repositorios/HorariosLojasRepositorioLaravel.php в строке 32 и как минимум 1 ожидаемое {"исключение" ":" [object] (Symfony \ Component \ Debug \ Exception \ FatalThrowableError (code: 0): слишком мало аргументов для функции Illuminate \ Support \ Collection :: get (), 0 передано в / var / www / html / code / app / Persistencia / Laravel / Repositorios / HorariosLojasRepositorioLaravel.php в строке 32 и по крайней мере 1 ожидается в /var/www/html/code/vendor/laravel/framework/src/Illuminate/Support/Collection.php:874)

0
Richard Nicson 4 Дек 2019 в 17:35

2 ответа

Лучший ответ

Когда вы используете all() с моделью Eloquent, вы фактически выполняете запрос.

Вы можете просто удалить вызов all() и получить:

public function getByLoja(string $uuid): array
{
    $horariosDaLoja = HorarioLoja::whereHas('loja', function ($loja) use ($uuid) {
        $loja->where('uuid', $uuid);
    })->get();

    $saida = [];
    foreach ($horariosDaLoja as $horario) {
        $saida[] = $this->horarioLojaTransformador->paraModelo($horario);
    }

    return $saida;
}

Поскольку использование get() с Eloquent возвращает коллекцию , вы даже можете что-то сделать лайк:

public function getByLoja(string $uuid): array
{
    return HorarioLoja::whereHas('loja', function ($loja) use ($uuid) {
            $loja->where('uuid', $uuid);
        })
        ->get()
        ->map(function ($horario) {
            return $this->horarioLojaTransformador->paraModelo($horario);
        })
        ->toArray();
}
1
Rwd 4 Дек 2019 в 16:26

Для метода get for collection требуется значение, проверьте документ: Collection-Get

Так что тебе это не нужно ->

$horariosDaLoja = $query->get();

Потому что здесь

       $query = HorarioLoja::all();
       $query = $query->where('loja', function($loja) use ($uuid) {
            $loja->where('uuid', $uuid);
        });

У вас есть записи в $ query и вы можете использовать -> метод toArray для сбора, проверьте toArray

           $query = $query->where('loja', function($loja) use ($uuid) {
            $loja->where('uuid', $uuid);
        })->toArray();
0
Patryk 4 Дек 2019 в 14:43