麻烦与hasMany并找到

时间:2012-04-23 17:50:16

标签: php cakephp find

我正在使用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列错误。

任何人都知道我在哪里弄错了?

提前致谢

1 个答案:

答案 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。