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

Dúvida - Auth

Pessoal, eu usei o padrão do Laravel pra criar o login, adicionei mais alguns campos, tudo certo, mas quando eu adicionei um Select com Estado e tentei pegar ele do banco de dados não deu certo, eu relacionei o Users com a tabela Estado e Estado com Cidade, mas não consigo mandar o parâmetro, pois só existe o Auth::routes(); e nao tem nenhum controller que eu possa jogar esse parâmetro no RegisterController, como eu posso passar esse parâmetro?

Obrigado!

5 respostas

Opa, bom dia, José!

Se eu não me engano, a classe abstract Auth é feita para autenticação, somente, para passagem de parâmetros você pode usar o Request.

Geralmente, a autenticação é feita em um Middleware, que é executado antes de qualquer chamada de rota.

Você poderia postar o erro exato da página, por favor?

Você chegou a criar e executar as migrations para essas novas tabelas?

Esse é os codigos, a ideia é fazer um combobox que puxe a cidade e estado, ao selecionar o option do estado carregue o de cidade, eu estou quebrando a cabeça pra conseguir pegar os campos de cidade, mas ta dando erro e eu não sei o que é.

Quando eu executo o getCidades ele dar esse erro:

Obrigado desde de já.

QueryException in Connection.php line 769: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'cidades' in 'field list' (SQL: select `id`, `cidades` from `cidades` where `cidades`.`estado_id` = 1 and `cidades`.`estado_id` is not null)

 <?php


namespace App\Http\Controllers;

use App\Estado;
use App\Cidade;
use App\Http\Requests;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Response;

class CidadeController extends Controller
{
      private $estadoModel;

    public function __construct(Estado $estado)
    {
        $this->estadoModel = $estado;
    }

    public function index()
    {
        $estados = $this->estadoModel->pluck('id','nome');

        return view('auth.register', compact('estados'));
    }

    public function getCidades($idEstado)
    {
        $estado = $this->estadoModel->find($idEstado);
        $cidades = $estado->cidades()->getQuery()->get(['id', 'cidades']);
        return Response::json($cidades);
    }

}

Model Cidade

class Cidade extends Model
{
   public function estado()
    {
        return $this->belongsTo('App\Estado');
    }
}

Model Estado

class Estado extends Model
{
    public function cidades()
    {
        return $this->hasMany('App\Cidade');
    }

}

Rotas

Route::get('cidades/{idEstado}', 'CidadeController@getCidades');

Script JavaScript

$('#estado').change(function () {
        var id_estado = $(this).val();

       // $('select[name=cidade]').html('').append('<option value="">  Carregando...  </option>');
        $.get('/cidades/' + id_estado, function (cidades) {
            $('#cidade').empty();
            $.each(cidades, function (key, value) {
                $('#cidade').append('<option value=' + value.id_cidade + '>' + value.nome + '</option>');
            });
        });
    });

Antes de mais nada, o PHP está dizendo que a coluna cidades não existe, o primeiro problema está aí

O segundo, é que você não está usando o Eloquent para fazer as queries, que facilita muito o seu trabalho, por exemplo, ao envés disso:

 $estado = $this->estadoModel->find($idEstado);

Você pode fazer algo como isso:

$estado = Estado::find($idEstado);

Por boa prática você deve importar as models utilizadas usando use, afim de usar o Eloquent, que é o ORM do Laravel.

Por exemplo, no meu projeto, para utilizar a classe/model categoria, que se relaciona com produtos eu importo e depois faço a referência aos métodos estáticos:

use app\Produto; // model de produto
use app\Categoria; //model de categoria
use Request;

Para fazer buscas, você pode fazer assim:

$produto = Produto::find($id);

if(empty($produto)) return 'Produto não encontrado';

        return view('produto.detalhes', ['produto' => $produto]);

Então, acho que você pode substituir sua função getCidades por algo parecido com:

//código omitido
 public function getCidades($idEstado)
    {

        $cidades = Estado::find($idEstado)->cidades;
        return Response::json($cidades);

    }

Dá uma boa lida nesse link aqui:

https://laravel.com/docs/5.3/eloquent-relationships

Outra coisa, não vejo necessidade em criar um JS pra preencher isso automaticamente, altera a view da home do Laravel pra incluir os campos de cidade que é melhor.

Se você está utilizando a versão 5.0, deverá estar em:

\app\resources\views\register.blade.php
solução!

A partir do momento que você cria uma relação como você fez colocando hasMany e belongsTo, o Eloquent deixa disponível um atributo que possui todos as Cidades para Estado.

Aí para acessar é só usar:

$cidades = Estado::find($idEstado)->cidades;

Estado é a classe abstrata, find, passando o parâmetro $idEstado irá buscar tudo o que for igual ao ID que você passou, ->cidades é o atributo disponível dentro de quaisquer estados devido ao relacionamento que você criou no model.