2011-04-07 11 views
8

Utilizo la función find ('todo') para recuperar los registros de publicación de mi base de datos, pero esto también devolverá toda la información de usuario asociada con el modelo de publicación con un belongsTo - hasMany relación.Recuperación de modelos sin obtener modelos asociados - CakePHP

La desventaja de esto es que el modelo de usuario contiene la contraseña y otra información importante. ¿Esto se considera un problema de seguridad? No estoy haciendo eco de la información de la vista.

Gracias


EDIT:

he modificado mi código, pero todavía estoy recibiendo los modelos asociados.

 $this->set('posts_list',$this->Post->find('all',array('contain' => false, 'order' => array('Post.price ASC')))); 

¿Alguna idea?

Respuesta

25

Tiene varias opciones. Puede establecer la propiedad recursive en un modelo:

$this->Post->recursive = -1; 
$posts = $this->Post->find('all'); 

Alterantively, puede especificar recursive como una opción para su búsqueda:

$posts = $this->Post->find('all', array(
    'recursive' => -1, 
    'conditions' => ... 
); 

También puede utilizar el comportamiento Containable en su modelo Post. En ese caso, se puede especificar un conjunto vacío:

class Post extends AppModel { 
    var $actsAs = array('Containable'); 
} 

$this->Post->contain(); 
$posts = $this->Post->find('all'); 

O, especificado en la consulta:

$posts = $this->Post->find('all', array(
    'contain' => false, 
); 

La ventaja para el comportamiento Containable es cuando más adelante en otros modelos asociados con su puesto. Supongamos que implementa un modelo de etiqueta.Ahora usted quiere encontrar un puesto con ella son las etiquetas, pero no el modelo de uso:

$posts = $this->Post->find('all', array(
    'contain' => array('Tag'), 
); 
+0

Gracias por su contribución. Probé el método 'contener' => falso, pero todavía devuelve el modelo asociado por algún motivo. Verifique la edición de mi código – AlexBrand

+0

¿Incluyó el comportamiento 'Containable' en su modelo? Ver mi edición arriba. –

+0

Me faltaba eso ... ¡Muchas gracias! – AlexBrand

0

Do u Utilice:

$this->Post->find('all')// If u access it from Post controller 

O,

$this->User->Post->find('all')//If u access it from User controller 
+0

sí ... pero también obtener el modelo de usuario. – AlexBrand

5

No necesariamente.

Pero está recuperando información cuando no la necesita. No es un problema ahora, pero hay que tener en cuenta que esto se convierte en un gran problema cuando se tiene una gran cantidad de datos asociados

Considere establecer el atributo recursive a -1 (o 0 si es necesario)

$this->Model->recursive = -1; 

Esto tirará los datos sólo desde el modelo seleccionado

o para más selección afinado, se puede utilizar el comportamiento Containable: http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html

Esto le permite seleccionar el que las asociaciones para mantener al recuperar datos.

+0

muchas gracias! Lo investigaré – AlexBrand

2

para que lo sepas

$this->Model->recursive = -1 will remove all associations 
$this->Model->recursive = 0 will remove only hasMany assosiation (so it keeps belongsTo) 
Cuestiones relacionadas