2011-09-20 34 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這兩個作品是如何,你會得到一個更好的主意。