Codeigniter - Active Record - Query - Update Method Database

Asked

Viewed 261 times

0

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

As the first image shows, when loading a registration form operadores, I list all the unidades registered in the system.

inserir a descrição da imagem aqui

So I select uma or mais unit, whose operador should belong.

And by clicking save, the objeto operador, that is marked red will be sent as following image:

Where that which is selected from green is (are) a(s) unit(s), of which the operador public.

inserir a descrição da imagem aqui

See the database structure in the following image.

inserir a descrição da imagem aqui

My doubt begins 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, delete unidade(s) at the operador.

Taking into account 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 the array, but exists in the database (in this case, delete from the database)
  • Unidade A does not exist in the array and does not exist in the database (in this case, does nothing).

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

  • Wagner, in case of update, I delete all items belonging to this user, and re-host, based on the submitted array.

2 answers

1


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

You may also have a method remover_unidade() who 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 data saving method):

// 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();
}
  • @Wagnerson You tried to do the way I posted it here?

  • Your array must be equal to $unidades and not in this way as he commented. It is he who will control the insertions and removals. That’s why I commented in the code that you should fit in your script.

  • But that’s what the code is doing. $unidades stores the Ids of the units that are being registered and then the query brings the registered Ids to make the comparison. If there are units in the table and not in the array, calls the exclusion method, otherwise it will treat the array to generate the INSERTs.

  • The method result() will bring the data in object form. So much that are accessed via $unidade->unidade_id, for example. You can bring in array also, but you’ll have to readjust the code.

  • I put as a response, as it was after some changes, but I accepted your reply. the reward, I will give as soon as the deadline..

  • help me with this: https://answall.com/questions/274978/compares%C3%A7%C3%A3o-entre-array-e-database-inclus%C3%A3o-e-exclus%C3%A3o-codeigniter

Show 1 more comment

0

Making some changes on Paul’s response, follows how it turned out and worked...

The method has been changed result for result_array and removed a foreach desnecessário.
The query parameters have also been 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);
    }

Browser other questions tagged

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