[Laravel] Iniciantes – Tutorial: Criando um formulário de contato – Parte 05

Laravel para iniciantes

Esta é a quinta parte do tutorial “Criando um formulário de contato”. No post anterior, vimos como validar os dados de uma requisição.

Nesse post vamos solicitar que o usuário selecione um categoria. Com isso, vamos explorar o relacionamento entre os models.


Passo 01: Criar tabela categorias

Vamos utilizar novamente o comando artisan do laravel para agilizar nosso trabalho. Execute:

php artisan make:model Categoria -m

criando model Categoria Laravel Eloquent

Este comando cria uma classe chamada “Categoria” que estende a “Model” dentro da pasta “app/”.

Ao passar o parâmetro  -m ele também criou o Schema da tabela “contatos”. Veja em  database/migrations/2015_10_18_175210_create_categorias_table .

Edite este arquivo adicionando a colunas:

Agora execute o seguinte comando no artisan para criar a tabela no banco de dados:

php artisan migrate

comando migrate laravel

Passo 02: Adicionar categorias de teste

Precisamos adicionar algumas categorias na nossa tabela. Para isso, vamos criar um seed para incluir esses registros. Execute o comando:

php artisan make:seed CategoriaSeed

comando make:seed laravel

Este comando cria uma classe chamada “CategoriaSeed” que estende a “Seeder” dentro da pasta database/seeds/ .

Edite a classe adicionando o código que insere as categorias:

Abra o terminal e execute:

php artisan db:seed --class="CategoriaSeed"

Podemos ver no banco de dados os registros incluídos

Lista de categorias no mysql

Passo 03: Adicionar a coluna categoria_id  na tabela contatos 

Abra o terminal e execute:

php artisan make:migration --table="contatos" alter_contatos_table

Criando migration de alteração laravel

Este comando cria a classe AlterContatosTable  dentro do arquivo  database/migrations/2015_10_19_154330_alter_contatos_table.php. Edite ela com o seguinte código:

Abra o terminal e execute

php artisan migrate

Exibindo a tabela com coluna criada Laravel

Ao executar o comando, foi criada a coluna categoria_id. Isso aconteceu pois o laravel identificou uma nova migration e executou o método up()

Se por algum acaso precisar de voltar atrás, execute o comando:

php artisan migrate:rollback

Migrate:rollback laravel

Ao executar o comando, a coluna categoria_id foi removida. Isso aconteceu pois o laravel executou o método down()  da última migrate executada.

Obs: Execute novamente o comando php artisan migrate para prosseguir com o tutorial.

Para saber mais sobre migrations, sugiro dar uma lida na documentação oficial:

http://laravel.com/docs/5.1/migrations

 

Passo 04: Adicionando a relação entre os models Contato  e Categoria 

Em nosso exemplo, a relação entre as entidades  Contato  e  Categoria é 1:N, ou seja, o contato pode ter uma categoria e a categoria pode ter vários contatos.

Abra o model app/Contato.php

Ao fazer isso, podemos recuperar a categoria de um contato da seguinte forma:

$categoria = $contato->categoria;

Mesmo chamando como se fosse um atributo, o Eloquent encontra o método que definimos no model e retorna uma instância da Categoria (se existir, é claro). Isso é feito utilizando métodos mágicos do PHP.

Vamos ver isso funcionando no Passo 07.

Passo 05: Adicionar um <select> de categorias no formulário de contato

Abra a view resources/views/welcome.blade.php e adicione o <select> no formulário:

Ficará assim:

Passo 06: Salvar também a  categoria_id 

Abra o controller app/Http/Controllers/ContatoController.php e adicione  $contato->categoria_id = $request->get('categoria_id');

Inicie o servidor com o php artisan serve , acesse http://localhost:8000 e adicione um novo contato:

Lista de categorias

Passo 07: Mostrar a categoria na lista

Abra a view resources/views/lista.blade.php e edite:

Abra a lista de contatos no navegador:

Lista de contatos com categoria

Dúvidas? Fique a vontade nos comentários!

  • Pingback: Laravel para Iniciantes: Tutorial "ContactMe"- Parte 01()

  • Carlos Gomes

    Muito bom Jansen… Este tutorial me ajudou muito. Nesta parte tinha muitas dúvidas!!! Você mostrou que é muito simples… Sem complicações!!! Uma coisa que faria diferente, seria passar pelo ContatoController para montar o na view!!!

    • Valeu Carlos!! Que bom saber que está ajudando!

      O que você faria diferente, seria mesmo o ideal! 😀

      To achando que vou editar o artigo rs.. Um abraço!

      • Carlos Gomes

        Bakana… Creio que não precise editar!!! Afinal é didático e não busca demonstrar fortemente designer patterns. Creio que deve continuar nesta linha de focar no Laravel. São apenas observações. Implementações podem acontecer de várias maneiras. O importante é o que quis mostrar, de como o Laravel pode facilitar nossas vidas!!! kkkk

  • Pingback: Laravel para Iniciantes: Tutorial "ContactMe"- Parte 06()

  • Pingback: Laravel para Iniciantes: Tutorial "ContactMe"- Parte 07()

  • Pingback: Laravel para Iniciantes: Tutorial "ContactMe"- Parte 03()

  • Nilson Alves

    Jansen, agora não consegui recuperar o atributo nome da categoria, se colocar o categoria_id ele exibe o número, mas como você colocou no exemplo(passo 7), aqui o sistema me retorna o erro….

    Whoops, looks like something went wrong.

    2/2
    ErrorException in f718827b477888bd100e9709e79f9e55f21dea34.php line 29:
    Trying to get property of non-object (View: C:xampp10contactMeresourcesviewslista.blade.php)

    • ola Nilson! como está o seu app/Contato.php? posta aí

      • Nilson Alves

        Jansen,

        belongsTo(Categoria::class);
        }
        }

        ….

        • tá faltando um return não? pois o problema é que não está conseguindo carregar o objeto =/

          • Nilson Alves

            Na verdade alterar esse ?

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

            ….

          • Nilson Alves

            Jansen,
            Até aí está igual nosso código, eu entendi que o método categoria() retorna todos os dados da tabela, e eu consegui visualizar no browser, mas especificamente nesse trecho de código…
            lista.blade.php…
            @foreach($contatos as $row)

            {{ $row->id }}
            nessa linha -> {{ $row->categoria->nome }}
            {{ $row->nome }}
            {{ $row->email }}
            {{ $row->mensagem }}

            @endforeach

            …é que apresenta o erro não setou o atributo categoria.nome, mas se eu colocar categoria.id ele me retorna o id conforme eu selecionei(dúvidas,descrição,outros).

          • uai rapaiz.. que estranho… pelo erro que vc falou.. só podia ser algum erro na declaração do método categoria() no model

          • Nilson Alves

            Pois é….agora eu fiquei meio vendido no passo 6 onde vc manda salvar categoria_id…esse é um atributo da tabela gravada no banco correto ? mas tive a impressão que seria +1 classe…se for eu não a criei…

          • Níssius Ribas

            Jansen mesmo problema aqui…

  • Ramilton Costa Gomes Junior

    Em qual local do arquivo controller eu tenho que colocar essa linha $contato->categoria_id = $request->get(‘categoria_id’);

    Outra coisa se eu não coloco essa linha o meu exemplo funciona perfeitamente mais o unico problema que no option eu tenho que colocar assim
    id }}”>{{ $campeonato->id }}
    e nesse caso ele mostra para o usuario só o id da categoria sem a sua descrição e se eu faço da forma que vc coloca no seu exemplo
    id }}”>{{ $categoria->nome }}
    e se eu adaptar para o meu

    id }}”>{{ $campeonato->descricao_descricao }}
    da o seguinte erro.

    SQLSTATE[23000]:
    Integrity constraint violation: 1452 Cannot add or update a child row: a
    foreign key constraint fails (BestSoccer.times, CONSTRAINT
    times_campeonato_id_foreign FOREIGN KEY (campeonato_id) REFERENCES
    campeonatos (id)) (SQL: insert into times (descricao_time,
    campeonato_id, updated_at, created_at) values (Vasco, Weldon Wolf,
    2016-06-15 18:12:41, 2016-06-15 18:12:41))

    O que me parece que ele está pegando o valor fora do value e armazenando e não o valor que está dentro value que seria o codigo.

    Será que vc pode me ajudar?

  • Kasio Eduardo

    só consegui utilizar no lista.blade.php
    trocando a linha 32 por ->> {{ $row->categoria[‘nome’] }} <<–

    • Ismael de Freitas

      Era isso!vlw!

      • Kasio Eduardo

        tmj mano espero ter ajudado.