Doubt in consultation Groupby and Checkbox - Laravel 5.5

Asked

Viewed 270 times

2

I am developing in PHP in Laravel Framework 5.5 and 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 assign or not checked to checkbox, until there works well..

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. inserir a descrição da imagem aqui

when I access the edit screen, the duplicated checkbox ( marked and unchecked) is being displayed and to resolve I went to the query and added a groupby, but it didn’t work as I hoped because that way the displayed record is only the one that is unchecked.

So I ask, suggestions for how to resolve?

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

1 answer

1


I was able to solve my problem by changing the way update and the insert so that I can use a where and get the records correctly.

In the previous code, I was recording only the checkboxes that were actually selected by the user, because of this fact, at the time of "editing", could not use a where in the sql query and this caused the error of duplicating the on-screen records.

As I found it very difficult to accomplish this I will post all my code here, to help beginners like me.

Screen HTML with 2 Checkbox Columns created dynamically (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 screen generated will be similar to this using bootstrap

inserir a descrição da imagem aqui

CSS - Code snippet 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 it :

INSERT When sending the form after completed, I also send a hidden checkbox of type (Hidden) marked.

done this check with array diff the checked and unmarked cheks. from there I make the inclusion in the bank. I also created a name field cod_permissao in the table to save the permission id so that I can get the values of that field in Edit when using the RightJoin (the code is commented)

Edit In the update I did pretty much the same thing When accessing the screen I use a if which checks which checks have been checked or not and in my controller I make a query using RightJoin to join the table through the field cod_permissao and from there I use the where to filter by profile then when I send the form to update the records, use again ArrayDiff to check marked and unmarked fields to then perform the update in the database.

well that’s what I hope you can understand.

Thank you all

Browser other questions tagged

You are not signed in. Login or sign up in order to post.