与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是唯一的)。结果必须是1!
因此,使用
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的语言?
发布于 2010-11-13 21:34:46
containable中的条件仅适用于容器内的模型。因为主查询没有任何条件,所以它提取表中的每一行。通常,您不使用containable来限制主查询,而是限制查询通过包含树的方式(当您需要遍历3-4级递归时非常方便,因为如果不包含,结果可能会变得非常臃肿)。
特别是在这种情况下,如果您试图获取特定语言/语言翻译对的数据,则可以直接从LanguageTranslation模型中提取数据。
$this->Language->LanguageTranslation->find(
'first',
array(
'conditions' => array( 'LanguageTranslation.id' => 1 ),
'recursive' => 1
)
);发布于 2010-11-14 17:42:31
可链接的行为可以做到这一点。
你可以从以下网址下载:https://github.com/rafaelbandeira3/linkable
模型
var $actsAs = array('Linkable');控制器
$language_array = $this->Language->find('all', array(
'link' => array('LanguageTranslation'),
'conditions' => array("LanguageTranslation.id = 1")
));发布于 2013-03-23 04:53:09
关于Juhana的回答:(最初调用find on the Language Model),您可以为对象子模型的父模型提供条件。
包含在单独的调用中。
<?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
https://stackoverflow.com/questions/4172670
复制相似问题