I was able to solve my problem by changing how to update
and insert
so that I can use where
and get the records correctly.
In the previous code, I was writing only the checkboxes
that were actually selected by the user, so at the time of "editing" I could not use a where
in the sql query and this caused the duplicate error. records on screen.
As I have encountered great difficulty in doing this, I will post all my code here, to help beginners like me.
Screen HTML with 2 dynamically created Checkboxes (Single form for both insert and edit)
{{--Tabela e CheckBox Permissões --}}
<div class="panel panel-primary">
<div class="panel-body">
<h4 class="text-center">Marque as Permissões: </h4>
<div class="col-md-12">
<table class="table table-striped">
<thead>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td class="">
<button class='btn btn-info' type='button' title='Todos' id='btnchk' ><i class='icon-large icon-ok'></i>Marcar Todos</button>
</td>
<td></td>
<td class="">
<button class='btn btn-info' type='button' title='Todos' id='btnchkdesmarcar' ><i class='icon-large icon-ok'></i>Desmarcar</button>
</td>
</thead>
@if(isset($perfispermissoes))
{{-- percorrendo a tabela para exibir os checks--}}
@foreach($permissoes as $keys => $dados_permissoes)
{{-- se o resto da divisão for par será exibido na coluna A --}}
@if(!($keys % 2))
<tr class="">
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td class="">
{{-- verificando se o valor do campo permissoes_id é igual ao campo Id (Tabela está com RightJoin) se form entra no IF --}}
@if($dados_permissoes->id_permissoes == $dados_permissoes->permissoes_id && $dados_permissoes->perfis_id == $perfis->id)
<p><input type="checkbox" class='chk' name="permissoes_id[{{$dados_permissoes->id_permissoes }}]" id="permissoes_id" checked value="{{$dados_permissoes->id_permissoes }}"> {{$dados_permissoes->nome}}</p>
<p><input type="hidden" class='chk' name="permissoes_id_desmarcados_novos[{{$dados_permissoes->id_permissoes }}]" id="permissoes_id" checked value="{{$dados_permissoes->id_permissoes }}"></p>
</td>
@elseif($dados_permissoes->perfis_id == $perfis->id && $dados_permissoes->cod_permissao == $dados_permissoes->id_permissoes)
<p><input type="checkbox" class='chk' name="permissoes_id[{{$dados_permissoes->id_permissoes }}]" id="permissoes_id" value="{{ $dados_permissoes->id_permissoes }}"> {{$dados_permissoes->nome}}</p>
</td>
@endif
{{-- se não será exibido na coluna B --}}
@else
<td></td>
<td class="">
{{-- verificando se o valor do campo permissoes_id é igual ao campo Id (Tabela está com RightJoin) se form entra no IF --}}
@if($dados_permissoes->id_permissoes == $dados_permissoes->permissoes_id && $dados_permissoes->perfis_id == $perfis->id)
<p><input type="checkbox" class='chk' name="permissoes_id[{{$dados_permissoes->id_permissoes }}]" id="permissoes_id" checked value="{{ $dados_permissoes->id_permissoes }}"> {{$dados_permissoes->nome}}</p>
<p><input type="hidden" class='chk' name="permissoes_id_desmarcados_novos[{{$dados_permissoes->id_permissoes }}]" id="permissoes_id" checked value="{{$dados_permissoes->id_permissoes }}"></p>
</td>
@elseif($dados_permissoes->perfis_id == $perfis->id && $dados_permissoes->cod_permissao == $dados_permissoes->id_permissoes)
<p><input type="checkbox" class='chk' name="permissoes_id[{{$dados_permissoes->id_permissoes }}]" id="permissoes_id" value="{{ $dados_permissoes->id_permissoes }}"> {{$dados_permissoes->nome}}</p>
</td>
@endif
</tr>
@endif
{{-- finalizando o foreach --}}
@endforeach
@else
{{-- percorrendo a tabela para exibir os checks--}}
@foreach($permissoes as $keys => $dados_permissoes)
{{-- se o resto da divisão for par será exibido na coluna A --}}
@if(!($keys % 2))
<tr class="">
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td class="">
<p><input type="checkbox" class='chk' name="permissoes_id[]" id="permissoes_id" value="{{ $dados_permissoes->id }}"> {{$dados_permissoes->nome}}</p>
<p><input type="hidden" class='chk' name="permissoes_id_desmarcados[]" id="permissoes_id" checked value="{{$dados_permissoes->id }}"></p>
</td>
{{-- se não será exibido na coluna B --}}
@else
<td></td>
<td class="">
<p><input type="checkbox" class='chk' name="permissoes_id[]" id="permissoes_id" value="{{ $dados_permissoes->id }}"> {{$dados_permissoes->nome}}</p>
<p><input type="hidden" class='chk' name="permissoes_id_desmarcados[]" id="permissoes_id" checked value="{{$dados_permissoes->id }}"></p>
</td>
</tr>
@endif
{{-- finalizando o foreach --}}
@endforeach
@endif
</table>
</div>
</div> <!-- Panel body -->
</div> <!-- Panel horizontal -->
the generated screen will be similar to this using bootstrap
CSS - Excerpt of the code to leave the sidebar horizontal
.conteudo-horizontal {
display: block;
height: 87%;
margin-left: 13%;
}
.panel-primary{
border-color:#23282e;
}
.panel-title.text-center{
color: #e1ffff;
}
.panel.panel-horizontal {
display: table;
height: 100%;
/* margin-left: 175px;*/
border-color:#23282e!important;
}
.panel.panel-horizontal>.panel-heading,
.panel-primary>.panel-heading{
background-color: #23282e;
}
.panel.panel-horizontal>.panel-heading,
.panel.panel-horizontal>.panel-body,
.panel.panel-horizontal>.panel-footer {
display: table-cell;
}
.panel.panel-horizontal>.panel-heading,
.panel.panel-horizontal>.panel-footer {
width: 1%;
border: 0;
vertical-align: middle;
}
.panel.panel-horizontal>.panel-heading {
border-right: 1px solid #ddd;
border-top-right-radius: 0;
border-bottom-left-radius: 4px;
}
.panel.panel-horizontal>.panel-footer {
border-left: 1px solid #ddd;
border-top-left-radius: 0;
border-bottom-right-radius: 4px;
}
Controller code
public function create()
{
// repassando o titulo da pagina em uma variavel
$title = 'Vincular Permissões ao Perfil';
// repassando a descrição da pagina em variavel
$desc = 'Vincule as Permissões a um determinado perfil para conceder acesso aos seus usuários';
$permissoes = $this->permissoes->all();
$permissoes = $this->permissoes->orderBy('nome')->get();
// consulta para obter as informações dos combos User_id e Perfis_id
$perfis = $this->perfis->all();
// retornando a view com as variaveis
return view('paineladmin.perfis_permissoes.insert-edit', compact('title', 'desc', 'permissoes', 'perfis'));
}
public function store(PerfisPermissoesRequests $request)
{
// recebendo todos os dados do formulário
$dataForm = $request->all();
// repassando o valor do Id
$id_perfis = $dataForm['perfis_id'];
/*************************** Verificando os dados que foram Marcados na Inclusão ****************/
/***********************************************************************************************/
// repassando os dados para a variavel collection para verificar com Array Diff
$collection = collect($dataForm['permissoes_id_desmarcados']);
// repassando os dados para a variavel collection para verificar com Array Diff
$collection2 = collect($dataForm['permissoes_id']);
// realizando a verificação atráves do Array Diff
$diff = $collection->diffKeys($collection2);
// aqui será retornado a diferenca entre os Arrays
$diferenca = $diff->all();
/////////// INSERT DOS DADOS COM CHECKBOX MARCADO ///////////
// percorrendo o campo permissoes id para armazenar os dados no array
foreach($dataForm['permissoes_id'] as $data) {
// repassando os valores para um array
$dataSet = [
'perfis_id' => $id_perfis,
'permissoes_id' => $data,
'cod_permissao' => $data,
];
// realizando o insert dos dados com checkbox marcado
$insert = $this->perfispermissoes->create($dataSet);
}
/////////////////////////////////////////////////////////////////
/////////// INSERT DOS DADOS COM CHECKBOX DESMARCADO ///////////
// verificando se a variavel possui valor para entrar no laço
if(!empty($diferenca)){
// percorrendo o campo permissoes id para armazenar os dados no array
foreach($diferenca as $data) {
// repassando os valores para um array
$dataSet2 = [
'perfis_id' => $id_perfis,
'permissoes_id' => null,
'cod_permissao' => $data,
];
// realizando o insert dos dados com checkbox desmarcado
$insert = $this->perfispermissoes->create($dataSet2);
}
}
// if de verificação
if($insert){
// repassando a mensagem de sucesso
$mensagem = $this->mensagem->msgCadastroSucesso();
// redirecionando para a rota
return redirect()->route('perfispermissoesIndex');
}else{
// repassando a mensagem de sucesso
$mensagem = $this->mensagem->msgErroInsert();
// redirecionando para a rota
return redirect()->back();
}
}
public function edit($perfis_id)
{
//descriptografando o ID
$perfis_id = decrypt($perfis_id);
// consulta para obter as informações de vínculo do perfil retornando o primeiro registro
// aqui retorna um unico objeto
$perfispermissoes = $this->perfispermissoes->where('perfis_id', '=', $perfis_id)
->first();
// consulta para obter as informações de vinculo do perfil e permissão
$permissoes = $this->perfispermissoes->rightjoin('permissoes', 'cod_permissao', '=', 'permissoes.id')
->select('perfis_permissoes.*','perfis_permissoes.cod_permissao', 'perfis_permissoes.permissoes_id as id_perfis_permissoes', 'permissoes.id as id_permissoes', 'permissoes.nome')
->where('perfis_id', '=', $perfis_id)
->orderby('permissoes.nome')
->get();
// Recuperando os dados do Perfil para Exibir no Combobox de filtro por Perfil
$perfis = $this->perfis->where('id', '=', $perfis_id)->first();
// variavel com o titulo do form
$title = 'Altere as Permissões / Perfis Vinculados';
// variavel com a descrição do form de edição
$desc = 'Altere as permissões vinculadas ao perfil';
return view('paineladmin.perfis_permissoes.insert-edit', compact('title', 'desc', 'perfispermissoes', 'perfis', 'permissoes', 'permissoescheck'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(PerfispermissoesRequests $request, $perfis_id)
{
// Descriptografando o ID
$perfis_id = decrypt($perfis_id);
// recebendo todos os dados do formulário
$dataForm = $request->all();
/*************************** Verificando os dados que foram DESMARCADOS *************************/
/***********************************************************************************************/
// repassando os dados para a variavel collection para verificar com Array DIFF
$collection = collect($dataForm['permissoes_id_desmarcados_novos']);
// repassando os dados para a variavel collection para verificar com Array DIFF
$collection2 = collect($dataForm['permissoes_id']);
// realizando a verificação atráves do Array Diff
$diff = $collection->diffKeys($collection2);
// retornando a diferença para a variavel
// aqui será retornado os dados que foram desmarcados.
$diferenca = $diff->all();
// verificando se a variavel possui valor para entrar no laço
if(!empty($diferenca)){
// percorrendo os dados desmarcado para apagar
foreach($diferenca as $dif){
// verificando os dados no banco
// o metodo first retorna sempre o primeiro registro em objeto
$update = $this->perfispermissoes->where('permissoes_id','=', $dif)
->where('perfis_id', '=', $perfis_id)->first();
// limpando os valores do campo 'permissoes_id'
$dataSet = [
'permissoes_id' => null,
];
// realizando o update na tabela e desmarcando o campo
$update = $update->update($dataSet);
}
}
/*************************** Verificando os dados que foram MARCADOS****************************/
/***********************************************************************************************/
// repassando os dados para a variavel collection para verificar com Array DIFF
$collection = collect($dataForm['permissoes_id']);
// repassando os dados para a variavel collection para verificar com Array DIFF
$collection2 = collect($dataForm['permissoes_id_desmarcados_novos']);
// realizando a verificação atráves do Array Diff
$diff = $collection->diffKeys($collection2);
// retornando a diferença para a variavel
// aqui será retornado os dados que foram desmarcados.
$novosregistros = $diff->all();
// verificando se a variavel possui valor para entrar no laço
if(!empty($novosregistros)){
// percorrendo o campo do id
foreach($novosregistros as $novosregistros) {
// verificando os dados no banco
// o metodo first retorna sempre o primeiro registro em objeto
$update = $this->perfispermissoes->where('cod_permissao','=', $novosregistros)
->where('perfis_id', '=', $perfis_id)->first();
// repassando os valores para um array
// aqui vai setar o valor no campo atraves do array
$dataSet = [
'permissoes_id' => $novosregistros,
];
// realizando o update e marcando o campo
$update = $update->update($dataSet);
}
}
// laço de verificação
if (isset($update)){
$mensagem = $this->mensagem->msgAtualizadoSucesso();
return redirect()->route('perfispermissoesEdit', encrypt($perfis_id));
}else{
$mensagem = $this->mensagem->msgErroEdit();
return redirect()->route('perfispermissoesEdit', encrypt($perfis_id));
}
}
Well basically I did this:
INSERT
When I submit the form after it is filled, I also send a hidden checkbox of the marked type.
I checked with array diff
the cheks that are checked and unchecked.
from there I make the inclusion in the bank.
I also created a field named cod_permissao
in the table to write the permission id so that I can get the values of that field in the edit when using RightJoin
(the code is commented)
Edit
In the update I did pretty much the same thing
When I access the screen I use a if
that checks which checks were checked or not and in my controller I make a query using RightJoin
to join the table through the cod_permissao
field and from there I use where
to filter by profile
Then when I submit the form to update the records, I use ArrayDiff
again to check the marked and unmarked fields and then to update
in the database.
Well that's what I hope you can understand.
Thanks to everyone