【问题标题】:CakePHP joining tables when a relationship exists存在关系时 CakePHP 加入表
【发布时间】:2011-04-27 17:27:47
【问题描述】:

我有一个 hasMany LibrarianMessage 模型。

我遇到的问题是,当我尝试将表连接到 Librarian 表时,该表尚未连接 - 即我创建的连接出现之前关系连接是已创建。

$this->Message->find('all', array(
  'joins' => array(
    array(
      'table' => 'users',
      'alias' => 'User',
      'conditions' => array('User.id = Librarian.id')
    )
  )
));

这会按照以下方式生成查询:

SELECT `Message`.`id`, `Message`.`librarian_id`, 
   `Message`.`Librarian`.`id`, `Librarian`.`user_id` 
    FROM `contact_messages` AS `Message` 
    INNER JOIN users AS `User` ON (`User`.`id` = `Librarian`.`user_id`) 
    LEFT JOIN `librarians` AS `Librarian` 
    ON (`Message`.`librarian_id` = `Librarian`.`id`)  
    WHERE `Message`.`id` = 3

我得到了错误

“on 子句”中的未知列“Librarian.user_id”

我如何才能加入到 hasMany 表之后它已经包含在构建查询中?

干杯

【问题讨论】:

  • 我在这里可能是错的 - 我通常使用两个左连接来模拟 habtm(你似乎在这里做的 - 消息 habtm 用户)

标签: php activerecord cakephp


【解决方案1】:

我倾向于通过将关系实际绑定到代码中来解决这个问题。这是一种 hacky 方法,非常古老,非常 1.2。

这是使用bindModel(),您可以在此处阅读,http://book.cakephp.org/view/3/The-Manual#!/view/78/Associations-Linking-Models-Together

模型方法的文档在这里,http://api12.cakephp.org/class/model#method-ModelbindModel

这个想法基本上是您可以暂时将两个模型绑定在一起,即使它们不存在关系,或者它们有远距离的关系。我已经做到了,它确实有效。我在某处有一些代码,但没有手头。

此外,如果您使用的是较新的东西,请务必查看Containable(),因为据我所知,它包含更多模型的绑定。 http://book.cakephp.org/#!/view/1323/Containable

【讨论】:

    【解决方案2】:

    我不确定自己解释得如何。

    我可能应该将问题分解为确切的关系:

    消息 hasMany 图书管理员
    图书管理员 belongsTo 用户

    这意味着我可以设置recursive = 2 来获取用户 数据。

    当然这很昂贵,但在这种情况下是很自然的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-04
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多