Natan Felles


Creative Webmaster


CodeIgniter - Helper de Banco de Dados para Adicionar e Remover Chaves Estrangeiras

Blog · desenvolvimento

CodeIgniter - Helper de Banco de Dados para Adicionar e Remover Chaves Estrangeiras

Se você trabalha com relacionamentos em tabelas de bancos de dados, principalmente ao utilizar o motor InnoDB do MySQL, com o framework CodeIgniter, então esse helper lhe pode ser muito útil.

Copie e cole o código abaixo em um arquivo chamado db_helper.php dentro da pasta helpers da sua aplicação e carregue-o com autoload ou $this->load->helper('db').

application/helpers/db_helper.php
<?php
/**
 * @author   Natan Felles <natanfelles@gmail.com>
 */
defined('BASEPATH') OR exit('No direct script access allowed');
if ( ! function_exists('add_foreign_key'))
{
    /**
     * @param string $table
     * @param string $foreign_key
     * @param string $references
     * @param string $on_delete
     * @param string $on_update
     *
     * @return string SQL command
     */
    function add_foreign_key($table, $foreign_key, $references, $on_delete = 'RESTRICT', $on_update = 'RESTRICT')
    {
        $constraint = "{$table}_{$foreign_key}_fk";
        $sql = "ALTER TABLE {$table} ADD CONSTRAINT {$constraint} FOREIGN KEY ({$foreign_key}) REFERENCES {$references} ON DELETE {$on_delete} ON UPDATE {$on_update}";
        return $sql;
    }
}
if ( ! function_exists('drop_foreign_key'))
{
    /**
     * @param string $table
     * @param string $foreign_key
     *
     * @return string SQL command
     */
    function drop_foreign_key($table, $foreign_key)
    {
        $constraint = "{$table}_{$foreign_key}_fk";
        $sql = "ALTER TABLE {$table} DROP FOREIGN KEY {$constraint}";
        return $sql;
    }
}

Você deve usar as funções desse helper dentro de uma query.

Para adicionar Chaves Estrangeiras, faça algo assim:

$table = 'users';
$fields = array(
    'id'         => [
        'type'           => 'INT(11)',
        'auto_increment' => TRUE,
    ],
    'country_id' => [
        'type'           => 'INT(11)',
    ],
);
$this->dbforge->add_field($fields);
$this->dbforge->add_key('id', TRUE);
$this->dbforge->create_table($table);
$this->db->query(add_foreign_key($table, 'country_id', 'countries(id)', 'CASCADE', 'CASCADE'));

E para remover as Chaves Estrangeiras, rode a função drop_foreign_key:

$table = 'users';
$this->db->query(drop_foreign_key($table, 'country_id'));
$this->dbforge->drop_table($table);

É isso, algo simples que poderá lhe ajudar a manter uma melhor integridade no gerenciamento de bancos de dados usando o CodeIgniter.

Gist

Sugestão

Admiro, utilizo e contribuo com o projeto Adminer, principalmente pela sua interface completa e simples de acompanhar a integridade de bancos de dados. Então, se você quiser utilizá-lo, mas não curtir muito a interface padrão, criei uma interface para ele baseada no Twitter Bootstrap 3 e está disponível no GitHub.

Adminer Bootstrap-Like