Migraciones en Laravel: Añadir columna solo si no existe

Las migraciones de Laravel son una herramienta fantástica. Permiten a todo el equipo tener la misma estructura de la base de datos sin tener que andar compartiendo ficheros sql. Basta con hacer un simple:

$ php artisan migrate

Y ya tenemos la misma estructura que el resto de gente del equipo.

Normalmente las migraciones crean o borran tablas y añaden, editan o eliminan columnas. Pero en algunas ocasiones tenemos que hacer algunas comprobaciones extra. Por ejemplo, comprobar si una columna existe antes de añadirla.

Para esto basta con usar Schema::hasColumn():

public function up()
{
    Schema::table('personas', function (Blueprint $table) {
        if (!Schema::hasColumn('personas', 'updated_at')) {
           $table->timestamp('updated_at');
        }
    });
 }

¿Y por qué puedo necesitar esto?

Es posible que te preguntes en qué escenarios es necesario hacer esta comprobación ya que deberíamos saber si la columna existe o no simplemente con mirar las migraciones.

La verdad es que he tenido que usar esto muy pocas veces. Y han sido normalmente porque:

  • Alguien ha modificado la base de datos directamente. Hay a quien le da mucha «pereza» usar migraciones y hacen los cambios en la base de datos directamente sin pensar en los demás.
  • Trabajamos con código heredado. Cuando trabajamos en una aplicación «legacy» podemos encontrar todo tipo de sorpresas y me he visto en la necesidad de usar esto e alguna ocasión.

Me siento solo, dime algo...