Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

[Dúvida] Request all não funciona com Select

Tenho uma dúvida aqui quanto a enviar um mass assignment pelo request->all()...

Acontece que no meu formulário possuo dois campos do tipo select, um relacionado a categoria do produto e outro relacionado a afiliação do produto. Porém, mesmo usando o fillable na model, ele envia pára a execução dizendo que o campo de select está nulo:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade Lá na minha model Produto está assim:

class Produto extends Model
{
    use HasFactory;
    protected $fillable = [
        'nomeProduto',
        'descricao',
        'linkAfiliado',
        'categoriaProdutoID',
        'afiliacaoID',
        'statusProduto'
    ];
}

E na função salvar:

public function salvar(Request $request)
    {
        $nomeProduto = $request->nomeProduto;
        $descricaoProduto = $request->descricao;
        $linkAfiliado = $request->linkAfiliado;
        $categoriaProduto = $request->categoriaProduto;
        $afiliacao = $request->afiliacao;

        Produto::create($request->all());
        /*$produto = new Produto();
        $produto->nomeProduto = $nomeProduto;
        $produto->descricao = $descricaoProduto;
        $produto->linkAfiliado = $linkAfiliado;
        $produto->categoriaProdutoID = $categoriaProduto;
        $produto->afiliacaoID = $afiliacao;
        $produto->statusProduto = 1;
        $produto->save();*/

        return redirect('/produtos/todos');
    }

Porque só os campos de select estão passando vazios? Quando o uso o outro formato - que está comentado no código - ele funciona normalmente.

10 respostas

No código comentado você tem: $produto->categoriaProdutoID = $categoriaProduto, sendo que $categoriaProduto = $request->categoriaProduto;. No código "com erro", não existe categoriaProdutoID, que é o campo definido em $fillable.

Acho que não ficou muito claro pra mim o erro rs

O que acontece é o seguinte, quando eu uso apenas o código que está comentado, no caso:

$produto = new Produto();
        $produto->nomeProduto = $nomeProduto;
        $produto->descricao = $descricaoProduto;
        $produto->linkAfiliado = $linkAfiliado;
        $produto->categoriaProdutoID = $categoriaProduto;
        $produto->afiliacaoID = $afiliacao;
        $produto->statusProduto = 1;
        $produto->save();

Esse código funciona perfeitamente, e ele envia os dados pro banco de dados. Acontece que quando uso apenas a sintaxe Produto::create($request->all());, o Laravel me diz que existe um campo com valor nulo e que ele não pode ser nulo como está no print. Aí que está minha dúvida...

Porque quando uso essa segunda sintaxe, mesmo passando os campos que devem ser enviados através da variável $fillable, ele me retorna um erro de campo vazio - no caso como eu mencionei ele é um SELECT - ?

mesmo passando os campos que devem ser enviados através da variável $fillable

Esse que é o problema: você não está passando os campos necessários.

Você está passando, no request, um valor categoriaProduto. O que você definiu no $fillable é categoriaProdutoID

Como solução para o problema, eu passei a enviar os campos num array dentro da função create, da seguinte forma:

Produto::create([
            'nomeProduto' => $nomeProduto,
            'descricao' => $descricaoProduto,
            'linkAfiliado' => $linkAfiliado,
            'categoriaProdutoID' => $categoriaProdutoID,
            'afiliacaoID' => $afiliacaoID,
            'statusProduto' => 1
        ]);

Dessa forma os dados são salvos corretamente no banco. Porém com a função all(), mesmo eu colocando o nome dos campos no formulário, banco e no $fillable idênticos, eles ainda retornam o erro nos selects e não nos inputs.

Elisame, o problema não é ser select ou input, o problema é que o nome do campo no formulário tá diferente do que você definiu no $fillable. No formulário está categoriaProduto e no banco (e no $fillable) está categoriaProdutoID.

Eu vou deixar o link do github nesse caso rs, se você puder dar uma olhada, porque eu ainda não encontrei a solução clara para isso https://github.com/ElisameAraujo/adminNaturezaCura

Elisame, tem bastante confusão no projeto, aparentemente. Executei aqui:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Em alguns lugares você usa categoriaProdutoID, em outras você usa categoriaProduto. Na migration o campo tá categoriaProduto, logo, você não deveria usar categoriaProdutoID em nenhum lugar. Ou então deveria renomear a coluna para ser categoriaProdutoID.

Sobre as migrations: Eu ainda não atualizei elas. Eu uso o MySQL Workbench para editar as colunas e configurações das tabelas quando preciso e depois atualizo as migrations.

Sobre as diferenças entre os nomes, como eu falei antes, eu mudei várias e vezes a coluna, o campo e o fillable de maneira que eles ficassem alinhados, porém, eu ainda não encontrei a solução pra esse erro pra esse campo em específico.

Como tá sendo meu primeiro grande projeto - e ainda mais em Laravel - ainda tô apanhando um pouco para fazer tudo funcionar seguindo os exemplos do curso.

Em resumo pra todo esse tópico, eu gostaria então de uma direção para melhorar esse projeto...

solução!

Se todos os campos forem corrigidos para possuírem o mesmo nome, tudo deve funcionar. Se algo não funcionar após a correção, atualiza o GitHub e manda aqui pra eu dar uma olhada. Mas com o código que você tem agora, o erro é a divergência nos nomes dos campos.

Depois de atualizar os campos mais uma vez - agora todos estão aparentemente alinhados -, o formulário funcionou lindamente e os dados são salvos tranquilamente no banco!

Deu trabalho Professor, mas obrigado pela paciência! Revisei e consegui fazer funcionar. Se você puder testar, eu acabei de atualizar o projeto no GitHub.