Questions in GroupBy Query and Checkbox - Laravel 5.5

2

I'm developing in PHP in the Laravel 5.5 Framework and I have the following code to create my checkboxes.

{{-- 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->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>

                @else                                                                                
                    <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->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>

                {{-- se não for exibe o check desmarcado--}}                                                    
                @else                     
                    <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 
{{-- finalizando o foreach --}}
@endforeach 

When I edit the data, I check and compare the record with the profile (ID) and through this checkbox or not checked, until it works perfectly ..

My problem is happening when the table has the same record with different profiles, ie the same record more than once, see the image below.

When I access the edit screen, the duplicate checkbox is displayed (checked and unchecked) and to resolve I went in the query and added a groupby , but it did not work as I expected so that the record displayed is only which is unchecked.

So I ask, suggestions on how to solve?

Below the code of my controller where the query is

 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', 'permissoes_id', '=', 'permissoes.id')                                             
                                             ->select('perfis_permissoes.*', 'perfis_permissoes.permissoes_id as id_perfis_permissoes', 'permissoes.id as id_permissoes', 'permissoes.nome')
                                             ->orderby('permissoes.nome')   
                                           //  ->groupby('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', 'teste'));
    }

Thank you

    
asked by anonymous 12.12.2017 / 20:04

1 answer

1

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

    
15.12.2017 / 00:49