【问题标题】:Trouble with hasMany and findhasMany 遇到问题并找到
【发布时间】:2012-04-23 17:50:16
【问题描述】:

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

有人知道我哪里出错了吗?

提前致谢

【问题讨论】:

    标签: php cakephp find


    【解决方案1】:

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

    但是,您可以为提取的 hasMany 项添加条件以进行 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。

    【讨论】:

    • 感谢您的回答,但前者返回给我所有的 usuarios 和他们的 llaves,而后者只给了我 llaves。但我发现让你的第二个查询最接近我想要的结果,所以我必须在 $this->Usuario->Llave 上为 Usuario(回绑定)和 CambioCorreo 执行 bindModels,然后在那里进行搜索。我想它有效,但从良好实践的角度来看,它做得好吗?
    • 如果它没有附加 Usuario,请确保您的模型有 $actsAs = array('Containable'); 以利用 ContainableBehavior(这是使用“包含”键的地方)。它会自动绑定和取消绑定模型。
    • 最后,我使用 Llave 模型检索将其与 'belongsTo' 关联绑定的数据。无论如何,感谢您的帮助。
    猜你喜欢
    • 2020-04-18
    • 2013-06-11
    • 2018-07-03
    • 1970-01-01
    • 2011-07-15
    • 2020-04-30
    • 1970-01-01
    • 2014-11-30
    • 2021-08-09
    相关资源
    最近更新 更多