CakePHP可容纳不';用适当的方法过滤
就像cakephp手册中的示例一样,我需要通过关联模型上的条件从模型中获取数据CakePHP可容纳不';用适当的方法过滤,php,cakephp,models,containable,Php,Cakephp,Models,Containable,就像cakephp手册中的示例一样,我需要通过关联模型上的条件从模型中获取数据 $this->Language->LanguageTranslation->find( 'first', array( 'conditions' => array( 'LanguageTranslation.id' => 1 ), 'recursive' => 1 ) ); 我有: 模型语言: class Langua
$this->Language->LanguageTranslation->find(
'first',
array(
'conditions' => array( 'LanguageTranslation.id' => 1 ),
'recursive' => 1
)
);
我有:
模型语言:
class Language extends AppModel {
var $name = 'Language';
var $actsAs = array('Containable');
var $hasMany = array(
'LanguageTranslation' => array(
'className' => 'LanguageTranslation',
'foreignKey' => 'language_id'
)
);
}
以及模型翻译协会
class LanguageTranslation extends AppModel {
var $name = 'LanguageTranslation';
var $belongsTo = array(
'Language'
);
}
当我这样做时:
$language_array = $this->controller->Language->find('all', array(
'contain' => "LanguageTranslation.id = 1"
));
我收到所有的语言,而不仅仅是一种(因为语言翻译中的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的语言?containable中的条件只适用于containable中的模型。因为主查询没有任何条件,所以它会获取表中的每一行。通常,您不使用containable来限制主查询,而是限制查询通过包含树的方式(当您需要通过3-4个递归级别时非常方便,如果不包含,结果可能会变得非常臃肿) 在这种情况下,特别是如果您试图获取某个语言/语言翻译对的数据,您可以从LanguageTranslation模型中提取数据
$this->Language->LanguageTranslation->find(
'first',
array(
'conditions' => array( 'LanguageTranslation.id' => 1 ),
'recursive' => 1
)
);
containable中的条件仅适用于安全壳内的模型。因为主查询没有任何条件,所以它会获取表中的每一行。通常,您不使用containable来限制主查询,而是限制查询通过包含树的方式(当您需要通过3-4个递归级别时非常方便,如果不包含,结果可能会变得非常臃肿) 在这种情况下,特别是如果您试图获取某个语言/语言翻译对的数据,您可以从LanguageTranslation模型中提取数据
$this->Language->LanguageTranslation->find(
'first',
array(
'conditions' => array( 'LanguageTranslation.id' => 1 ),
'recursive' => 1
)
);
可链接的行为会起作用 您可以在以下网站下载: 模型 控制器
可链接的行为会起作用 您可以在以下网站下载: 模型 控制器
关于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')
));
?>
如果需要对子模型应用条件,只需在contain调用中将条件数组添加到子模型的索引中。例如:
<?php
$this->Language->contain(array(
'LanguageTranslation' => array(
'conditions' => array('<LanguageTranslationConditionHere>')
)
));
?>
希望这有帮助
-Andrew关于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')
));
?>
如果需要对子模型应用条件,只需在contain调用中将条件数组添加到子模型的索引中。例如:
<?php
$this->Language->contain(array(
'LanguageTranslation' => array(
'conditions' => array('<LanguageTranslationConditionHere>')
)
));
?>
希望这有帮助
-安德鲁好的,谢谢你的夸奖;因此,我认为手册中的示例是错误的。我同意手册如果没有错误,至少有一点误导性;因此,我认为手册中的例子是错误的。我同意手册如果没有错误,至少有一点误导。