使用find防止hasMany模型上的关联查询

时间:2011-09-20 10:36:25

标签: php cakephp

我有一个与其他模型有几个hasMany关联的模型。我注意到的一件事是,当我对父表进行查询时,也会查询所有关联的表。为了表现,我想阻止这一点,因为我不需要每次调用父模型时都有这些数据。

这是我目前的父模型:

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'
    )
);

 );?>

这就是我在查询日志中看到的内容。我看到的问题是在使用find时始终会出现查询12-17。但是,我正在使用一种行为从我的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 个答案:

答案 0 :(得分:2)

如果您不想在查询查询中提取所有hasMany数据,请将recursive的值设置为-1,如同在控制器中一样

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

更好的选择是使用Containable行为,这样您就可以指定要获取哪些模型,哪些不可以。 http://book.cakephp.org/view/1323/Containable

答案 1 :(得分:1)

正确使用'recursive''unbind model'非常好的蛋糕功能,将您的查询限制在有用的数据中。

检查here两者是如何工作的,你会得到一个更好的主意。