与cakephp手册http://book.cakephp.org/view/1323/Containable#Containing-deeper-associations-1325中的示例一样,我需要通过其关联模型上的条件从模型中获取数据。
我有:
模型语言:
class Language extends AppModel {
var $name = 'Language';
var $actsAs = array('Containable');
var $hasMany = array(
'LanguageTranslation' => array(
'className' => 'LanguageTranslation',
'foreignKey' => 'language_id'
)
);
}
和协会,ModelTranslation
class LanguageTranslation extends AppModel {
var $name = 'LanguageTranslation';
var $belongsTo = array(
'Language'
);
}
当我这样做时:
$language_array = $this->controller->Language->find('all', array(
'contain' => "LanguageTranslation.id = 1"
));
我收到所有语言,而不仅仅是一种语言(因为LanguageTranslation中的id是唯一的)。结果必须是一个!
所以,
debug($language_array);
结果是:
Array
(
[0] => Array
(
[Language] => Array
(
[id] => 1
[code] => it
[locale] => ita
)
[LanguageTranslation] => Array
(
[0] => Array
(
[id] => 1
[language_id] => 1
[language] => italiano
)
)
)
[1] => Array
(
[Language] => Array
(
[id] => 2
[code] => en
[locale] => eng
)
[LanguageTranslation] => Array
(
)
)
[2] => Array
(
[Language] => Array
(
[id] => 3
[code] => de
[locale] => ger
)
[LanguageTranslation] => Array
(
)
)
)
为什么我不只捕获id = 1的语言?
答案 0 :(得分:2)
可链接的行为将起到作用。
您可以下载: https://github.com/rafaelbandeira3/linkable
var $actsAs = array('Linkable');
$language_array = $this->Language->find('all', array(
'link' => array('LanguageTranslation'),
'conditions' => array("LanguageTranslation.id = 1")
));
答案 1 :(得分:1)
可包含的条件仅适用于收容内的模型。因为主查询没有任何条件,所以它会获取表中的每一行。通常,您不使用可包含来限制主查询,而是限制查询通过包含树的方式(当您需要经历3-4级递归时非常方便,如果不包含,结果会变得非常膨胀)。
在这种情况下,特别是如果您尝试获取某个Language / LanguageTranslation对的数据,您只需从LanguageTranslation模型中提取数据。
$this->Language->LanguageTranslation->find(
'first',
array(
'conditions' => array( 'LanguageTranslation.id' => 1 ),
'recursive' => 1
)
);
答案 2 :(得分:0)
关于Juhana的回答:(最初在语言模型上调用find),您可以为以子模型为目标的父模型提供条件。
包含在单独的电话中。
<?php
$this->Language->contain(array(
'LanguageTranslation'
));
$lang = $this->Language->find('first', array(
'conditions' => array('LanguageTranslation.id' => 1)
));
?>
包含一个电话。
<?php
$lang = $this->Language->find('first', array(
'conditions' => array('LanguageTranslation.id' => 1),
'contain' => array('LanguageTranslation')
));
?>
如果需要对子模型应用条件,只需将条件数组添加到包含调用中的子模型索引即可。例如:
<?php
$this->Language->contain(array(
'LanguageTranslation' => array(
'conditions' => array('<LanguageTranslationConditionHere>')
)
));
?>
希望这有帮助!
-Andrew