2011-09-20 31 views
0

我有一个与其他模型有几个hasMany关联的模型。我注意到的一件事是,当我对父表进行查询时,也会查询所有关联的表。为了表现的缘故,我想阻止这种情况,因为我不需要每次调用父级模型时的这些数据。使用find查找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' 
    ) 
); 

);?> 

这是我的查询日志是送走。我看到的问题是,查询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 
+1

http://stackoverflow.com/questions/7440589/foreign-key-definition-in-cakephp-lazy-loading/7440679#7440679检查此... – Rikesh

回答

2

如果你不想把所有的数据的hasMany在查找查询设置递归的价值在你的控制器

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

一个更好的选择是使用中可容纳的行为为-1像,这种方法您可以指定要提取哪些模型,哪些不可以。 http://book.cakephp.org/view/1323/Containable

+0

我通常在任何模型上使用Containable行为协会。除非你不关心性能,否则这是IMO的基本要求。 –

1

做正确使用'recursive''unbind model'非常好蛋糕的功能来限制你的查询您的高达有用的数据。

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