Codeigniter - Active Record - Query - Database update method

0

Hello! I ask this question in order to get a doubt I have, and to be able to read other people's ideas, how I can insert or delete an item, a certain operador_id .

As shown in the first image, when loading a operadores registration form, I have ready all unidades registered in the system.

ThenIselectumaormaisunit,whoseoperadorshouldbelong.

Andwhenyouclicksave,theobjetooperador,whichismarkedinredwillbesentasfollows:

Wherewhatisselectedingreen,is(are)theunit(s),whoseoperadorpercente.

Lookatthestructureofthedatabase,inthefollowingimage.

My question starts here.
If it is for inclusion, I can use the method, as in the example below:

public function incluir_unidade($dados, $operador_id)
{
    $array = (array) $dados;
    foreach ($dados as $uni)
    {
        $unidade = [
            'ope_id'        => $operador_id,
            'uni_id'        => $uni->unidade_id,
        ];
        $this->db->insert($this->tb_operador_unidade, $unidade);
    }
}

But I wanted to understand, how can I do in case of update:
To insert, exclude unidade(s) to operador .

Considering the tables below:

  • Unidade A exists in the array, but already exists in the database (in this case it does nothing)
  • Unidade A exists in the array and does not exist in the database (in this case, it includes)
  • Unidade A does not exist in array, but exists in database (in this case, database deletion)
  • Unidade A does not exist in the array and does not exist in the database (in this case, it does nothing).

This example is just what I imagine, if there is another way to do it, I'd like to know ..

    
asked by anonymous 02.02.2018 / 15:45

2 answers

2

You can call a verificar_unidade() method, for example, before executing incluir_unidade() and in this method you make a SELECT by bringing all the units registered to the given operator. This way you can compare what is being inserted with what is already inserted in the table.

You can also have a remover_unidade() method that will be responsible for removing the units that will no longer be associated with the operator.

Model :

public function verificar_unidade($operador_id)
{
    $this->db->select('unidade_id');
    $this->db->from('tb_operador_unidade');
    $this->db->where('operador_id', $operador_id);

    return $this->db->get();
}

public function remover_unidade($unidade_id, $operador_id)
{
    $this->db->where('unidade_id', $unidade_id);
    $this->db->where('operador_id', $operador_id);
    $this->db->delete('tb_operador_unidade');
}

Controller (within your method that saves the data):

// Array com os IDs das unidades que estão sendo inseridas. Ex.: 1, 4 e 6
// Não entendi exatamente como está recebendo esses valores via POST, por isso deixei estático.
// Isso deve ser dinâmico e deve ser ajustado no seu código.
$unidades = [1, 4, 6];

$consulta = $this->nome_do_seu_model->verificar_unidade($operador_id);

if ($consulta->num_rows())
{
    // Se encontrou registros, o operador já possui unidades. Vamos verificar:

    foreach ($consulta->result() as $unidade)
    {
        if ( ! in_array($unidade->unidade_id, $unidades))
        {
            // Remove unidades que estão na tabela, mas não estão no array.
            $this->model->remover_unidade($unidade->unidade_id, $operador_id);
        }
        else
        {
            // Estão na tabela e no array, então remove do array p/ evitar INSERTs duplicados
            $chave = array_search($unidade->unidade_id, $unidades);

            unset($unidades[$chave]);
        }
    }

    // Aqui itera o array $unidades p/ realizar INSERTs 
    foreach ($unidades as $unidade)
    {
        // O ID da unidade deve ser passado como parâmetro junto com ID do operador
        // Aqui chama o método: $this->nome_do_seu_model->incluir_unidade();
    }
}
else
{
    // Não possui unidades, faz só os INSERTs...
    // Aqui chama o método: $this->nome_do_seu_model->incluir_unidade();
}
    
02.02.2018 / 19:51
0

Making some changes to Paul's answer, it follows how it stayed and worked ...

The result method was changed to result_array and removed a foreach desnecessário . Also the query parameters were changed ..

$verifica_unidade = $this->operador->verificar_unidade($operador_id);

    if ($verifica_unidade->num_rows())
    {
        // se encontrou registros, o operador já possui unidades. vamos verificar:
        foreach ($verifica_unidade->result_array() as $unidade)
        {               
            if (!in_array($unidade, $unidades))
            {                   
                $this->operador->remover_unidade($unidade['uni_id'], $operador_id);             
            }
            else
            {
                // estão na tabela e no array, então remove do array p/ evitar INSERTs duplicados
                $chave = array_search($unidade, $unidades);
                unset($unidades[$chave]);
            }
        }               
            $this->operador->incluir_unidade($unidades, $operador_id);
    }
    else
    {
        // não possui unidades, faz somente os INSERTs...
        $this->operador->incluir_unidade($unidades, $operador_id);
    }
    
05.02.2018 / 15:50