1

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

有谁知道我在哪里犯错?

提前致谢

4

1 回答 1

3

hasMany 关系不是在同一个 SQL 语句中左连接的,因此您不能在同一个语句中对它们使用条件。HABTM 也是如此。

但是,您可以向为 Usuario 搜索拉取的 hasMany 项目添加条件。

$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。

于 2012-04-23T18:02:26.550 回答