[Datamapper + Codeigniter] Update de relaciones

liebgott

Hola

Estoy probando cosas con datamapper. Uso este codigo para guardar (y actualizar). Funciona bien cuando edito el nombre, pero cuando selecciono otro curso del multiselect del form añade otra relación, en lugar de borrar las existentes y guardar solo lo último que recibe

$estudiante=new Student();
        $estudiante->where('id', '17')->get();
        $estudiante->name=$this->input->post('nombre');    
foreach ($this->input->post('curso') as $key => $value) { $curso = new Course(); $curso->get_by_name($value); $estudiante->save($curso); }

Mi join table

id_student | id_course
17             1
17             2 

Cuando selecciono un valor nuevo en el multiselect (y solo uno, pongamos, curso con id=3, deseleccionando lo que ya existe), hace esto

id_student | id_course
17             1
17             2
17             3 

En lugar de

id_student | id_course
17             3 

Que estoy haciendo mal?

Saludos y gracias!

Thanks!!

NeB1

#1 No deberás borrar a mano las relaciones que tienes guardadas en la DB, antes de almacenar la que acaba de seleccionar? (no tengo ni papa de codeigniter, pero en programación estándar, harías un delete antes del insert).

PiradoIV

¿y en el modelo Student le has puesto has_one Course?

liebgott

Ya esta, no se si es del todo ortodoxo:

    $estudiante=new Student();
            $estudiante->where('id', '17')->get();
            $estudiante->name=$this->input->post('nombre');    

           // Como decia NeB1 borrar todas las relaciones antes de guardar la/s nueva/s
            $todos = $estudiante->course->get()->all;
	$estudiante->delete($todos);

        foreach ($this->input->post('curso') as $key => $value) {
              $curso = new Course();
            $curso->get_by_name($value);
            $estudiante->save($curso);

            }
PiradoIV

En principio deberías poder hacerlo así también:

$estudiante = new Student();
$estudiante->get_by_id(17); // Puedes usar el get_by_id aquí

// Por seguridad en CI se hace así, tiene un filtro XSS
$estudiante->name = $this->input->post('nombre', TRUE);

$estudiante->course->get();
$estudiante->delete($estudiante->course->all);

$cursos = $this->input->post('curso', TRUE);
foreach ($cursos as $key => $value) {
    $curso = new Course();
    $curso->get_by_name($value);
    $estudiante->save($curso);
}
liebgott

Y para pasar la ID dinamicamente?... digamos que estoy editanto al estudiante 35 desde students/editar_socio/35

si hago esto

$estudiante = new Student();
$estudiante->get_by_id($this->uri->segment(3));

etc...

crea una nuevo estudiante en lugar de editar el estudiante con la id 35. Como puedo capturar la id del estudiante que estoy editando desde la view y pasarsela al controller?

liebgott

vale, x si a alguien le sirve

en el form de la view...

<input type="hidden" value="<?php print $estudiante->id?>" name="id" />

en el controller

$estudiante=new Student();
$id = $this->input->post('id');
$estudiante->get_by_id($id);
etc...
PiradoIV

Para pillar la ID desde la URL lo puedes hacer así si quieres:

/students/editar_socio/35

<?php if (! defined('BASEPATH')) exit('No direct script access');

class Students extends Controller {

function __construct() {
	parent::Controller();
}

function index() {
}

function editar_socio($id = NULL) {
	
	// Si no le pasamos una ID, le
	// enviamos a una página de error
	$this->load->helper('url');
	if(!$id) site_url('url_del_error');
	
	$this->load->model('student');
	
	// etc...
	
}

}

Usuarios habituales

  • PiradoIV
  • liebgott
  • NeB1