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

Problemas ao salvar

Bom dia, estou com problemas após salvar um objeto, criei um relacionamento entre Produtos e Categoria, criei um dropdown para escolher uma categoria, mas ao finalizar cadastro é redirecionado a uma mensagem: "Trying to get property 'id' of non-object ", tentei de tudo e não consigo resolver.

Produto Model

class Produto extends Model
{
    public $timestamps = false;
    protected $fillable = ['categoria_id', 'nome', 'descricao', 'preco'];

    public function categoria()
    {
        return $this->belongsTo(Categoria::class, 'categoria_id');
    }
}

Categoria

class Categoria extends Model
{
    public $timestamps = false;
    protected $fillable = ['nome'];

    public function produtos()
    {
        return $this->hasMany(Produto::class);
    }
}

ProdutosController

use App\Categoria;
use App\Produto;
use Illuminate\Http\Request;

class ProdutosController extends Controller
{
    public function index(Request $request) 
    {
        $produtos = Produto::query()
                    ->orderBy('nome')
                    ->get();
        $mensagem = $request
                    ->session()
                    ->get('mensagem');
        /*echo '<pre>';
        var_dump($produtos);
        echo '</pre>';*/
        return view('produtos.index', compact('produtos', 'mensagem'));
    }

    public function create()
    {
        $categorias = Categoria::all();

        return view('produtos.create', compact('categorias'));
    }

    public function store(Request $request)
    {
        $produtos = Produto::create([
                'nome' => request('nome'), 
                'descricao' => request('descricao'), 
                'preco' => request('preco'),
                'categoria_id' => request('categoria_id')
            ]);

        $request->session()
            ->flash(
                'mensagem', 
                "Produto {$produtos->nome} criado com sucesso."
            );

        return view('produtos.index', compact('produtos', 'mensagem'));
    }

    public function destroy(Request $request)
    {
        Produto::destroy($request->id);
        $request->session()
                    ->flash(
                        'mensagem',
                        "Produto removido com sucesso"
                        );

        return redirect()->route('listar_produtos');
    }
}
4 respostas

create.blade.php

    <form method="post">
    @csrf
        <div class="row">
            <div class="col col-6">
                <label for="nome">Nome:</label>
                <input type="text" class="form-control" name="nome">
                <label for="descricao">Descrição:</label>
                <input type="text" class="form-control" name="descricao">
            </div>
            <div class="col col-2">
            <label for="categoria_id">Categoria:</label>
            <select name="categoria_id" id="categoria_id" class="form-control">
                <option>Selecione...</option>
                @foreach($categorias as $c)
                <option value="{{ $c->id }}">{{ $c->nome }}</option>
                @endforeach
            </select>
            <label for="preco">Preço:</label>
            <input type="number" name="preco" class="form-control" id="preco">
            </div>
        </div>
        <button class="btn btn-primary mt-2 float-right">Adicionar</button>
        <a href="JavaScript: window.history.back();" class="btn btn-primary mt-2 float-right mr-2">Voltar</a>
    </form>

@endsection

index.blade.php

    <table class="table table-striped table-hover">
        <thead class="thead-dark">
            <tr>
                <th>Id</th>
                <th>Nome</th>
                <th>Descrição</th>
                <th>Tipo</th>
                <th>Preço</th>
                <th>Ação</th>
            </tr>
        </thead>
        @foreach($produtos as $produto)            
        <tr>
            <td>{{ $produto->id }}</td>
            <td>{{ $produto->nome }}</td>
            <td>{{ $produto->descricao }}</td>
            <td>{{ $produto->categoria->nome }}</td>
            <td>{{ $produto->preco }}</td>
            <td>
            <form method="post" action="/produtos/remover/{{ $produto->id}}" onsubmit="return confirm('Tem certeza que deseja remover {{ addslashes( $produto->nome )}}?')">
                @csrf
                @method('DELETE')
                <button class="btn btn-danger btn-sm">
                    <i class="far fa-trash-alt"></i>
                </button>
            </form>
            </td>
        </tr>
        @endforeach
    </table>
    <a href="produtos/criar" class="btn btn-dark mb-2 float-right">Adicionar</a>

Olá, Grasiela. Tem muito código pra eu poder analisar de forma sucinta aqui.

Me diz qual linha o PHP diz ter o erro, e me mostra qual o conteúdo dessa linha, por favor?

Assim que cadastro um produto, ele registra mas antes de retornar ao index ele mostra esse problema

Trying to get property 'id' of non-object (View: /home/grasiela/projetos/produtos-estoque/resources/views/produtos/index.blade.php)
 @foreach($produtos as $produto)            
        <tr>
            <td>{{ $produto->id }}</td>
            <td>{{ $produto->nome }}</td>
            <td>{{ $produto->descricao }}</td>
            <td>{{ $produto->categoria->nome }}</td>
            <td>{{  number_format($produto->preco, 2) }}</td>
            <td>
            <form method="post" action="/produtos/remover/{{ $produto->id}}" onsubmit="return confirm('Tem certeza que deseja remover {{ addslashes( $produto->nome )}}?')">
                @csrf
                @method('DELETE')
                <button class="btn btn-danger btn-sm">
                    <i class="far fa-trash-alt"></i>
                </button>
solução!

Consegui resolver, o problema estava no retorno da função store(), fiz a correção e pronto.