我正在使用CakePHP 2.0工作一个月,今天我发现find()上的hasMany关系存在一些问题。
模型Usuario(用户)的关系如下:
$this->Usuario->bindModel(array(
'hasMany' => array(
'CambioCorreo' => array(
'className' => 'CambioCorreo',
'foreignKey' => 'id_usuario',
),
'Llave' => array(
'className' => 'Llave',
'foreignKey' => 'id_usuario',
))));
但是当我尝试使用此发现时:
$u = $this->Usuario->find('all',array('conditions' => array('Llave.llave' => $llave,'Llave.id_tipo_llave' => 3,'Llave.fecha_creacion = CambioCorreo.fecha')));
,我明白了:
错误:SQLSTATE [42S22]:未找到列:1054'where子句'中的未知列'Llave.llave'
奇怪的是,在做hasMany关系之前,我做了一个错误的hasOne,并且效果很好。但是现在,我将bindModel从“hasOne”更改为“hasMany”,并且出现了SQL列错误。
任何人都知道我在哪里弄错了?
提前致谢
答案 0 :(得分:3)
hasMany关系在同一个SQL语句中没有LEFT连接,因此您不能在同一语句中使用它们的条件。 HABTM也是如此。
但是,您可以为Usuario搜索提取多个项目的条件。
$this->Usuario->find('all', array(
'contain' => array(
'Llave' => array(
'conditions' => array(
'Llave.llave' => $llave
)
)
)
));
这将找到所有Usuario记录,并将所有Llave记录带入llave => $llave
。
这个过程是这样的:Cake创建一个SQL语句来查找所有Usuario记录,然后为每个Usuario记录分离SQL语句,以便根据上述条件提取各自的Llave记录。然后它将它们连接成一个阵列。
要根据Llave的条件查找Usuario记录,您需要绑定一个hasOne关系,以便您可以使用条件进行过滤,或首先搜索Llave记录并包含其Usuario记录,如:
$this->Usuario->Llave->find('all', array(
'conditions' => array(
'Llave.llave' => $llave
),
'contain' => array(
'Usuario'
)
));
搜索Llave记录,然后加入各自的用户。但是,您最终可能会出现重复的Usuario记录,因为它们可能有多个Llave。