Содержимое не будет фильтровать модель 2-го уровня с HABTM & hasMany - PullRequest
0 голосов
/ 29 ноября 2010

Что у меня есть:

"A" HABTM "C" HABTM "A" through join table "B"
"A" hasMany "B" belongsTo "A"
"C" is ordered by a "B" field

Что я хочу:

// result:
[0] => array( 
    A => array( /* single model's fields I still need*/ ),
    C => array(
        [0] => array( C.field1, C.field2, ... /* Model C fields*/ ), 
        [1] => array( C.field1, C.field2, ... )
    )
) 

Что я пробовал:

// this gives me data I don't need:
A->find('all', array( 'conditions' => array( 'id' => $id ) ) )
// result:
[0] => array( 
    A => array( /* single model's fields I need*/ ),
    B => array( /* I DON'T NEED */
        [0] => array( ... )
        [1] => array( /* ... etc, tons records I don't need */ )
    ),
    C => array(
        [0] => array( C.field1, C.field2, ... /* I need these fields*/ 
            [B] => array( /* I DON'T NEED */ )
        ),
        [1] => array( C.field1, C.field2, ...  )
            [B] => array( /* ... etc, each has a model B I don't need ... */)
        )
    )
)

Используя Containable, я могу немного урезать запрос, но все еще есть связанная с ним модель:

// this is a little better
A->find('all', array( 
    'conditions' => array( 'id' => $id ),
    'contain' => array( 'C' )
))
// result:
[0] => array( 
    A => array( /* single model's fields I still need*/ ),
    C => array(
        [0] => array( C.field1, C.field2, ... /* I still need Model C fields*/ 
            [B] => array( /* I still DON'T need this Model's fields */ )
        ),
        [1] => array( C.field1, C.field2, ... 
            [B] => array( /* ... still has unneeded model B */)
        )
    )
)

NB1 : Я прочитал это , это и это из книги, а также это и это .

NB2 : я тоже пробовал

C->recursive = -1 // no effect

C->unbindModel(array('hasAndBelongsToMany'=>A)) // no effect

A->find('all', array(                    // not what I want, but it's still 
    'conditions' => array('id' => $id),  // odd that this doesn't filter C's 
    'contain' => array('A.B')));         // fields out. same as second result

A->find('all', array(                    // also not what I want, but it's 
    'conditions' => array('id' => $id),  // weird that this doesn't filter B's 
    'contain' => array('A.B.field')));   // fields at all; 

1 Ответ

1 голос
/ 29 ноября 2010

ContainableBehavior автоматически возвращает поля, необходимые для отображения результатов.

Цитирование со страницы , которую вы уже прочитали:

$this->Post->find('all', array('contain' => 'Comment.author'));

... // data returned:

[Comment] => Array
    (
        [0] => Array
            (
                [author] => Daniel
                [post_id] => 1
            )
...

Как видите, массивы комментариев содержит только поле автора (плюс post_id, который нужен CakePHP отобразить результаты).

В случае отношений HABTM возвращается модель соединения со связанными внешними ключами, поскольку поля a_id и c_id обязательны для заполнения. Я предлагаю просто проигнорировать это и взять ценности, которые вам нужны. Если хотите, вы можете взглянуть на join , поскольку Containable иногда запрашивает БД много, много раз. Тем не менее, данные для связанных моделей не будут возвращаться так же хорошо, как Containable.

...