Предотвращение связанных запросов в модели hasMany с помощью find - PullRequest
0 голосов
/ 20 сентября 2011

У меня есть модель, которая имеет несколько ассоциацийMany с другими моделями. Одна вещь, которую я заметил, это то, что когда я делаю запрос к родительской таблице, все связанные таблицы также запрашиваются. Ради производительности я бы хотел этого избежать, поскольку мне не нужны эти данные при каждом обращении к родительской модели.

Это моя текущая родительская модель:

class UserEntity extends UserAgentAppModel {
var $name = 'UserEntity';
var $primaryKey = 'entity_id';
var $actsAs = array('EavEntity');

var $validate = array(
    'user_name'=>array(
        'rule'=>'isUnique',
        'message'=>'This username has already been taken. Please try again'
),
    'user_pass' => array(
        'rule' => array('between', 8, 16),
        'message' => 'Passwords must be between 8 and 16 characters long.')

);

var $hasMany = array(
    'UserEntityVarchar' => array(
        'className' => 'UserEntityVarchar',
        'foreignKey' => 'entity_id',
        'isEav' => 'true'
    ),
    'UserEntityDatetime' => array(
        'className' => 'UserEntityDatetime',
        'foreignKey' => 'entity_id',
        'isEav' => 'true'
    ),
    'UserEntityInteger' => array(
        'className' => 'UserEntityInteger',
        'foreignKey' => 'entity_id',
        'isEav' => 'true'
    ),
    'UserEntityBoolean' => array(
        'className' => 'UserEntityBoolean',
        'foreignKey' => 'entity_id',
        'isEav' => 'true'
    ),
    'UserEntityArray' => array(
        'className' => 'UserEntityArray',
        'foreignKey' => 'entity_id',
        'isEav' => 'true'
    )
);

 );?>

Это то, что я вижу в журнале запросов. Проблема, которую я вижу, заключается в том, что запросы 12-17 всегда возникают при использовании find. Однако я использую поведение для извлечения этих данных из моей модели eav.

1   SHOW FULL COLUMNS FROM `user_entities`      8   8   1
2   SELECT CHARACTER_SET_NAME FROM INFORMATION_SCHEMA.COLLATIONS WHERE COLLATION_NAME= 'latin1_swedish_ci';     1   1   1
3   SHOW FULL COLUMNS FROM `user_entity_varchars`       4   4   1
4   SHOW FULL COLUMNS FROM `user_entity_datetimes`      4   4   1
5   SHOW FULL COLUMNS FROM `user_entity_integers`       4   4   1
6   SHOW FULL COLUMNS FROM `user_entity_booleans`       4   4   1
7   SHOW FULL COLUMNS FROM `user_entity_arrays`     4   4   1
12  SELECT `UserEntity`.`entity_id`, `UserEntity`.`user_name`, `UserEntity`.`user_pass`, `UserEntity`.`user_status`, `UserEntity`.`user_group`, `UserEntity`.`instance_id`, `UserEntity`.`is_logged_in`, `UserEntity`.`is_visible` FROM `user_entities` AS `UserEntity` WHERE 1 = 1     2   2   0
13  SELECT `UserEntityVarchar`.`value_id`, `UserEntityVarchar`.`attribute_id`, `UserEntityVarchar`.`entity_id`, `UserEntityVarchar`.`value` FROM `user_entity_varchars` AS `UserEntityVarchar` WHERE `UserEntityVarchar`.`entity_id` IN (1, 2)      3   3   0
14  SELECT `UserEntityDatetime`.`value_id`, `UserEntityDatetime`.`attribute_id`, `UserEntityDatetime`.`entity_id`, `UserEntityDatetime`.`value` FROM `user_entity_datetimes` AS `UserEntityDatetime` WHERE `UserEntityDatetime`.`entity_id` IN (1, 2)       0   0   0
15  SELECT `UserEntityInteger`.`value_id`, `UserEntityInteger`.`attribute_id`, `UserEntityInteger`.`entity_id`, `UserEntityInteger`.`value` FROM `user_entity_integers` AS `UserEntityInteger` WHERE `UserEntityInteger`.`entity_id` IN (1, 2)      0   0   0
16  SELECT `UserEntityBoolean`.`value_id`, `UserEntityBoolean`.`attribute_id`, `UserEntityBoolean`.`entity_id`, `UserEntityBoolean`.`value` FROM `user_entity_booleans` AS `UserEntityBoolean` WHERE `UserEntityBoolean`.`entity_id` IN (1, 2)      0   0   0
17  SELECT `UserEntityArray`.`value_id`, `UserEntityArray`.`attribute_id`, `UserEntityArray`.`entity_id`, `UserEntityArray`.`value` FROM `user_entity_arrays` AS `UserEntityArray` WHERE `UserEntityArray`.`entity_id` IN (1, 2)        0   0   0
22  SHOW FULL COLUMNS FROM `eav_attributes`     8   8   1
23  SELECT `EavAttribute`.`attribute_id`, `EavAttribute`.`attribute_code`, `EavAttribute`.`backend_model`, `EavAttribute`.`frontend_input`, `EavAttribute`.`frontend_label`, `EavAttribute`.`is_required`, `EavAttribute`.`is_user_defined`, `EavAttribute`.`is_unique` FROM `eav_attributes` AS  `EavAttribute` WHERE `attribute_id` = 5       1   1   0
24  SELECT `EavAttribute`.`attribute_id`, `EavAttribute`.`attribute_code`, `EavAttribute`.`backend_model`, `EavAttribute`.`frontend_input`, `EavAttribute`.`frontend_label`, `EavAttribute`.`is_required`, `EavAttribute`.`is_user_defined`, `EavAttribute`.`is_unique` FROM `eav_attributes` AS `EavAttribute` WHERE `attribute_id` = 6        1   1   0
25  SELECT `EavAttribute`.`attribute_id`, `EavAttribute`.`attribute_code`, `EavAttribute`.`backend_model`, `EavAttribute`.`frontend_input`, `EavAttribute`.`frontend_label`, `EavAttribute`.`is_required`, `EavAttribute`.`is_user_defined`, `EavAttribute`.`is_unique` FROM `eav_attributes` AS `EavAttribute` WHERE `attribute_id` = 7

Ответы [ 2 ]

2 голосов
/ 20 сентября 2011

Если вы не хотите извлекать все данные hasMany в запросе поиска, установите значение рекурсивного значения -1, как в вашем контроллере

   $results = $this->Model->find('all', 'recursive' => -1));

Лучшим вариантом является использование поведения Containable, этоТаким образом, вы можете указать, какие модели выбрать, а какие нет.http://book.cakephp.org/view/1323/Containable

1 голос
/ 20 сентября 2011

Правильно используйте 'рекурсивный' и 'модель отмены привязки' очень хорошая функциональность торта, чтобы ограничить ваш запрос полезными данными.

Проверка здесь как работают оба, вы получите лучшее представление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...