What is the correct way to save related data in Laravel 5.2? I have a small application where I need to register data of a company and its respective address. When I try to save the data I get the error:
TokenMismatchException in VerifyCsrfToken.php line 67:
But I have already defined the Token in the view. In the controller I used Request :: all () twice to save the company and to save the address. Is that correct?
Following Codes:
COMPANY MODEL
class Empresa extends Eloquent
{
use SoftDeletes;
protected $table = 'empresas';
public $timestamps = true;
protected $guarded = ['id'];
protected $fillable = array(
'razao_social',
'nome_fantasia',
'cnpj',
'tipo_empresa',
'tipo_cobranca',
'telefone',
'email',
'numero_colaborador',
);
public function enderecos()
{
return $this->hasMany('SGW\Endereco');
}
}
MODEL ENDERECO
class Endereco extends Model
{
use SoftDeletes;
protected $table = 'enderecos';
public $timestamps = true;
protected $guarded = ['id'];
protected $fillable = array(
'cidade_id',
'estado_id',
'empresa_id',
'endereco',
'numero',
'complemento',
'bairro',
'cep',
'tipo',
);
public function empresas()
{
return $this->belongsTo('SGW\Empresa');
}
}
COMPANIESCONTROLLER
public function store()
{
$empresa = Empresa::create(Request::all());
$empresa->enderecos()->createMany(Request::all());
Session::flash('flash_message', 'Empresa ' . Request::input('nome_fantasia') . ' cadastrada com sucesso!');
return redirect()->action('EmpresaController@index');
}
VIEW
@extends('layout.index')
@section('titulo', 'CADASTRO DE EMPRESAS')
@section('conteudo')
<div class="box-header with-border">
<!-- Exibe a mensagem de retorno (Create, Update, Delete) -->
@if(Session::has('flash_message'))
<div class="alert alert-success alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
<h4><i class="icon fa fa-check"></i> Sucesso!</h4>
{{ Session::get('flash_message') }}
</div>
@endif
<a href="{{ action('EmpresasController@index') }}" class="btn btn-info btn-lg pull-right">
<i class="fa fa-building-o"></i> Lista de empresas
</a>
</div>
<div class="box-body">
<!-- form start -->
<form action="{{ action ('EmpresasController@store') }}" method="post" class="form-horizontal padding-left">
<input type="hidden" name="_token" value="{{{ csrf_token() }}}" />
<div class="box-body col-xs-6">
<br />
<div class="form-group">
<div class="col-xs-12">
<label for="razao_social">*Razão Social</label>
<input type="text" class="form-control" name="razao_social" value="">
</div>
</div>
<div class="form-group">
<div class="col-xs-12">
<label for="nome_fantasia">*Nome Fantasia</label>
<input type="text" class="form-control" name="nome_fantasia" value="">
</div>
<div class="col-xs-7">
<label for="cnpj">*CNPJ</label>
<input type="text" class="form-control" name="cnpj" data-inputmask='"mask": "99.999.999/9999-99"' data-mask>
</div>
</div>
<div class="form-group">
<div class="col-xs-7">
<label for="tipo_empresa">*Tipo Empresa</label>
<select class="form-control" id="tipo_empresa" name="tipo_empresa">
<option value=""></option>
<option value="Empresário Individual">Empresário Individual</option>
<option value="Microempreendedor Individual">Microempreendedor Individual</option>
<option value="Sem fins lucrativos">Sem fins lucrativos</option>
<option value="Sociedade Anônima">Sociedade Anônima</option>
<option value="Sociedade em Comandita Simples">Sociedade em Comandita Simples</option>
<option value="Sociedade Empresária">Sociedade Empresária</option>
<option value="Sociedade Limitada">Sociedade Limitada</option>
<option value="Sociedade Simples">Sociedade Simples</option>
</select>
</div>
</div>
<div class="form-group">
<div class="col-xs-7">
<label for="tipo_cobranca">*Tipo Cobrança</label>
<select class="form-control" id="tipo_cobranca" name="tipo_cobranca">
<option value=""></option>
<option value="Adiantamentos">Adiantamentos</option>
<option value="Cheque">Cheque</option>
<option value="Depósitos">Depósitos</option>
<option value="DOC">DOC</option>
<option value="Duplicata">Duplicata</option>
<option value="Ficha de Compensação">Ficha de Compensação</option>
<option value="Ordem de Pagamento">Ordem de Pagamento</option>
<option value="TED">TED</option>
</select>
</div>
</div>
<div class="form-group">
<div class="col-xs-7">
<label for="email">*E-mail</label>
<input type="email" name="email" class="form-control" value="">
</div>
</div>
<div class="form-group">
<div class="col-xs-7">
<label for="telefone">*Telefone</label>
<input name="telefone" type="tel" class="form-control" data-inputmask='"mask": "(999) 99999-9999"' data-mask>
</div>
</div>
<div class="form-group">
<div class="col-xs-7">
<label for="numero_colaborador">*Nº Colaboradores</label>
<input name="numero_colaborador" type="number" class="form-control" value="">
</div>
</div>
</div>
<div class="box-body col-xs-1"></div>
<div class="box-body col-xs-5">
<br />
<div class="form-group">
<div class="col-xs-11">
<label for="address">*Endereço</label>
<input id="endereco" name="endereco" type="text" class="form-control">
</div>
</div>
<div class="form-group">
<div class="col-xs-4">
<label for="numero">*Número</label>
<input id="numero" name="numero" type="text" class="form-control">
</div>
<div class="col-xs-7">
<label for="complemento">Complemento</label>
<input id="complemento" name="complemento" type="text" class="form-control ">
</div>
</div>
<div class="form-group">
<div class="col-xs-7">
<label for="bairro">*Bairro</label>
<input id="bairro" name="bairro" type="text" class="form-control">
</div>
<div class="col-xs-4">
<label for="cep">*Cep</label>
<input id="cep" name="cep" type="text" class="form-control" data-inputmask='"mask": "99999-999"' data-mask>
</div>
</div>
<div class="form-group">
<div class="col-xs-11">
<label for="estado">*Estado</label>
<select class="form-control" id="estado_id" name="estado_id" required>
<option value=""></option>
@foreach ($estados as $e)
<option value="{{$e->id}}">{{$e->nome}}</option>
@endforeach
</select>
</div>
</div>
<div class="form-group">
<div class="col-xs-11">
<label for="cidade">*Cidade</label>
<select class="form-control" id="cidade_id" name="cidade_id" required>
<option value="">Selecione um Estado...</option>
</select>
</div>
<input type="hidden" name="tipo" value="emp" id="tipo" />
</div>
</div>
<!-- /.box-body -->
<div class="box-body col-xs-12">
<br />
<button type="submit" class="btn btn-lg btn-success pull-right" data-loading-text="Cadastrando...">
<i class="glyphicon glyphicon-save"></i> Cadastrar
</button>
</div>
</form>
</div>
<!-- /.box-body -->
@stop @section('post-script')
<script type="text/javascript">
$('select[name=estado_id]').change(function() {
var idEstado = $(this).val();
$('select[name=cidade_id]').empty();
$('select[name=cidade_id]').append("<option value='' disabled selected style='display:none;'>Carregando...</option>");
$.get("create/cidades/" + idEstado, function(cidades) {
$('select[name=cidade_id]').empty();
$('select[name=cidade_id]').append("<option value='' disabled selected style='display:none;'>Selecione uma cidade</option>");
$.each(cidades, function(key, value) {
$('select[name=cidade_id]').append('<option value=' + value.id + '>' + value.cidade + '</option>');
});
});
});
</script>
@stop
I changed the store () from EmpresasControler to:
public function store()
{
$endereco = new Endereco();
$endereco->endereco = Request::input('endereco');
$endereco->numero = Request::input('numero');
$endereco->complemento = Request::input('complemento');
$endereco->bairro = Request::input('bairro');
$endereco->estado_id = Request::input('estado_id');
$endereco->cidade_id = Request::input('cidade_id');
$endereco->cep = Request::input('cep');
$endereco->tipo = Request::input('tipo');
$empresa = Empresa::create(Request::all());
$empresa->enderecos()->save($endereco);
Session::flash('flash_message', 'Empresa ' . Request::input('nome_fantasia') . ' cadastrada com sucesso!');
return redirect()->action('EmpresasController@index');
}
It worked but I do not think it's the right way to do it.