Default en ActiveRecord

edited mayo 2012 in Dudas/Problemas
Hola, mi pregunta es ¿como puedo hacer que mis modelos tomen el valor por DEFAULT especificado en la base de datos?

Muchas gracias.

Comentarios

  • el ActiveRecord sabe que campos de la tabla tienen valores por defecto, y al guardar un registro, si no le especificas un valor a los campos que tienen default, esos campos tomarán ese valor por defecto.
  • Muchas gracias por la respuesta pero para mi, no esta funcionando asi.

    Realice la siguiente prueba:

    - La base de datos es PostgreSql 9
    CREATE TABLE tabla (
      id SERIAL, 
      valor VARCHAR(20) DEFAULT 'ESTE ES EL DEFAULT!' NOT NULL, 
      CONSTRAINT tabla_pkey PRIMARY KEY(id)
    );

    - El código en el controller es el siguiente
    $t = Load::model('tabla');
    $t2 = new Tabla();
    $t->save();
    $t2->save();
    Flash::valid('Prueba t1: '.$t->valor.' t2: '.$t2->valor);

    Realicé pruebas con el campo valor como "NULL" y como "NOT NULL"

    Los resultados fueron:

    - Como NULL: en la base de datos es insertado el campo "valor" como NULL
    - Como NOT NULL: se muestra un Flass::error, con el mensaje "El campo valor no puede ser nulo"

    ¿Alguna sugerencia?

    Muchas gracias.
  • Ya se pueden trabajar con valores por defecto en postgres hermano, rencientemente se hizo ese cambio:


    Debes descargar la nueva versión del core, la rama dev.

    se han hecho varias mejoras interesantes: https://github.com/KumbiaPHP/KumbiaPHP/network
  • Ok, muchas gracias voy a probar a ver que tal y perdon por tardar tanto en responder, en cuanto tenga el resultado de las pruebas te informo para cerrar el tema.
  • Ok, descargué la version en desarrollo y realice la misma prueba, pero en este caso no muestra el error de que el campo no puede ser NULL, sino que dispara una excepcion diciendo:

    KumbiaException: al ejecutar <em>'INSERT INTO tabla () VALUES ()'</em> (0)

    jejeje creo que hay un pequeño problema aun con esa clase PGSQL...

    Alguna sugerencia?
  • eso está muy raro, esa version es la que estoy usando con postgres, sin mayor problema...
  • puedes colocar el codigo de tu modelo tabla ? los modelos no deben tener constructor ( __construct ), por eso seria bueno ver como estas construyendo la clase modelo y poder hubicar el problema con exactitud.

    Saludos...!!!
  • Hola, para responder a la pregunta anterior el modelo solo dice: class Tabla extends ActiveRecord no tiene mas lineas por lo que era una prueba.

    Encontré la fuente del problema a partir de las siguientes pruebas :)

    1) Tabla con un solo campo aparte del id y con valor default y no nulo.  => Error mensionado en comentario anterior.

    2) Tabla con un solo campo aparte del id y con valor default y nulo. => Error mensionado en comentario anterior.

    3) Tabla con dos campos aparte del id y todos dos con valor default y no nulos => Error mensionado en comentario anterior.

    4) Tabla con dos campos aparte del id y todos dos con valor default y nulos => Error mensionado en comentario anterior.

    5) 4) Tabla con dos campos aparte del id, pero uno con valor default y no nulo y el otro nulo y sin valor default => Todo funciona correctamente.
  • Conclusión? si todos los campos aparte del id poseen valores por default y no son especificados en el modelo la sentencia "insert into tabla() values()" queda vacía generando la Exception.

    :) espero que esto sea de ayuda para el framework :) ya que estoy muy interesado en seguirlo usando.

    Muchas gracias.
  • Muchas gracias por el dato, pero realmente no creo que se de un caso donde queramos guardar un registro sin pasar al menos algún valor en alguno de los campos, esto al menos para mi no parece tener lógica, (discúlpenme si me equivoco).

    Más sin embargo, podrias colocar un ejemplo de como debe ser la consulta en postgres para guardar un registro sin pasar ningun valor ?

    en mysql esto funciona:

    INSERT INTO tabla () values ();

    No consegui hacer un INSERT INTO parecido en postgres.

    Saludos...!!!

  • Ya conseguí hacer un insert donde si se especifique el campo, aunque queramos cargar valor por defecto:

    INSERT INTO tabla (campo_con_defecto) values (DEFAULT);

    usando la palabra reservada DEFAULT se le indica a la consulta que queremos que dicho campo se llene con 
    su valor por defecto. solo lo probé con mysql y postgres, habrá que ver, si funciona en los demás drivers.

    Nuevamente muchas gracias por el dato...!!!
  • Hola, si esa palabra funciona con Sql Server y con Oracle también, así que tal vez podrían tenerlo en cuenta mas adelante no se jejeje, por cierto me gustaría saber donde puedo publicar recomendaciones o problemas que valla encontrando con el framework, ya que me interesa colaborar en lo que mas pueda.

    Saludos.
  • en github hermano:

    https://github.com/KumbiaPHP/KumbiaPHP

    tienes la pestaña de los issues:

    https://github.com/KumbiaPHP/KumbiaPHP/issues

    para ese tipo de cuestiones, ademas puedes hacer fork del proyecto, hacer modificaciones y mandarlas a traves de pull request.

    Saludos...!!!
Sign In or Register to comment.