Find () con asociaciones profundas usando Containable, asociaciones de modelos

Estoy tratando de crear una vista que muestre una tabla de notas de un usuario. Los memorandos tienen un tipo (memo_type) y varios autores; la tabla de autores se compone de registros: id, memo_id, user_id, precedencey MemoType es id, memo_type_desc. (Los memos también tienen un propietario (Memo.user_id), pero esa es una consulta simple y tengo una tabla separada que funciona bien)

La idea es que cuando veo detalles sobre un usuario, muestre una tabla de todos los memorandos que el usuario aparece como autor e incluya el tipo de memorando (Carta, Presentación, etc.)

Entonces, aunque puedo obtener la matriz que necesito de una lectura () con recursiva = 3 (ver más abajo), esto es lento y recupera una TONELADA de datos, por lo que estoy tratando de usar container. (Podría omitir el memo_type_desc pero los usuarios finales lo quieren).

Bien, entonces pongo public $actsAs = array('Containable'); in app_model.php

Una gran cosa a tener en cuenta aquí es que obtengo la misma matriz independientemente del nivel adicional de asociación para MemoTypes, cuando agrego => array('MemoTypes.memo_type_desc') No veo un nivel adicional en la matriz. Y con este tercer nivel de asociación también me sale un error:

Advertencia (512): el modelo "Memo" no está asociado con el modelo "MemoTypes" [CORE/cake/libs/model/behaviors/containable.php, línea 343

Las asociaciones de modelos están a continuación, y aquí está la función Ver en user_controller. ¿Alguna idea de lo que está mal con mi asociación Memo/MemoTypes o sintaxis find()?

Editar: Ah, y soy un novato en pasteles y heredé esta aplicación. PD, la tabla está construida por un foreach en view.ctp, pero la paginación seguramente sería mejor, pero no tengo idea de por dónde empezar. = O

// Trying to get Containable method to work...
$this->set('userstuff', $this->User->find('all', array(
    'conditions' => array('User.id' => $id),
    'contain' => array(
        'Author.user_id',
        'Author.precedence',
        'Author.memo_id' => array(
            'Memo.memo_type_id' => array(
                'MemoTypes.memo_type_id' // <--problem here?
            )
        )
    )
)));

Resultados:

Array
(
    [0] => Array
        (
            [User] => Array
                (
                    [id] => 1026
                    [group_id] => 2
                    [name] => John Doe
                    [username] => jd20001
                    [grpnum] => 99
                    [created] => 2010-03-22 15:08:35
                    [modified] => 2012-04-05 13:31:15
                )

            [Author] => Array
                (
                    [0] => Array
                        (
                            [user_id] => 1026
                            [precedence] => 0
                            [memo_id] => 2579
                            [Memo] => Array
                                (
                                    [memo_type_id] => 1
                                )

                        )

                    [1] => Array
                        (
                            [user_id] => 1026
                            [precedence] => 0
                            [memo_id] => 2583
                            [Memo] => Array
                                (
                                    [memo_type_id] => 1
                                )

                        )

                    [2] => Array...

Más:

// Works, but retrieves entire users/memos tables so large memory footprint
$this->User->recursive = 3;
$this->set('user', $this->User->read(null, $id));

Usuario.php:

var $belongsTo = array(
    'Group' => array(
        'className' => 'Group',
        'foreignKey' => 'group_id'
    )
);
var $hasMany = array(
    'Author' => array(
        'className' => 'Author',
        'foreignKey' => 'user_id',
        'dependent' => true
    ),
    'Memo' => array(
        'className' => 'Memo',
        'foreignKey' => 'user_id',
        'dependent' => false
    )
);

Memo.php:

var $hasMany = array(
    'Author' => array(
        'className' => 'Author',
        'foreignKey' => 'memo_id',
        'dependent' => true,
        'order' => 'precedence'
    )
);
var $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'MemoType' => array(
        'className' => 'MemoType',
        'foreignKey' => 'memo_type_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

Memo_tipo.php:

var $hasMany = array(
    'Memo' => array(
        'className' => 'Memo',
        'foreignKey' => 'memo_type_id',
        'dependent' => false
    )
);

preguntado el 22 de mayo de 12 a las 16:05

1 Respuestas

Bueno, mucho más leyendo y finalmente 'lo entiendo' (y solo una hora de esfuerzo después de publicar mi pregunta... es curioso cómo funciona).

El usuario y el grupo me brindan mi información principal, luego Memo me permite crear una tabla de documentos 'propietarios', y el autor me brinda datos sobre todos los documentos donde el usuario figura como autor. Wow, después de un año de trabajar con CakePHP, solo ahora lo estoy apreciando mucho :)

$this->set('user', $this->User->find('first', array(
    'conditions' => array('User.id' => $id),
    'contain' => array(
        'Group',
        'Memo',
        'Author' => array(
            'Memo' => array(
                'MemoType' => array(
                    'fields' => array('memo_type_desc')
                )
            )
        )
    )
)));

contestado el 23 de mayo de 12 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.