【问题标题】:how to get CakePHP many-to-many result如何获得 CakePHP 多对多结果
【发布时间】:2011-03-25 01:43:40
【问题描述】:

我使用 images_units 连接表在模型 Image 和 Units 之间建立了多对多关系。

如何将此查询转换为 cakePHP find()?

SELECT * FROM Image, Units, images_units WHERE images_units.unit_id = 29;

现在我正在 Image->find('all', $params); 上尝试 find();没有运气。

【问题讨论】:

  • 该查询无论如何都不起作用,您根本没有查看连接表。

标签: php cakephp


【解决方案1】:

直接来自 CakePHP 手册:

$this->Image->bindModel(array('hasOne' => array('ImagesUnit')));
$this->Image->find('all', array('fields' => array('Image.*'),'conditions' => array('ImagesUnit.unit_id' => 29)));

当然,您需要在模型中定义 HABTM 关联。 See the whole section on HABTM 学习如何使用它。

【讨论】:

  • 非常感谢!正是我要找的东西:)我会看一下文档。
  • 在控制器中绑定模型,你也可以在模型中使用: var $hasOne = 'ImagesUnit';这意味着您可以跳过第一行: $this->Image->bindModel(array('hasOne' => array('ImagesUnit')));
  • 哦,是的,确实如此。我提出了一些“最佳实践”(不一定是社区的最佳实践),其中之一是在模型中定义这种关联,并且永远不要动态绑定它。如果你需要处理一个没有关联的模型,那么你可以使用loadModel方法。我总是建议放弃递归功能并选择 Containable 行为。这个ebook 解释了这个 Containable 技术。
  • 我才发现下载电子书的链接坏了。这是一个新链接:pseudocoder.com/Super_Awesome_Advanced_CakePHP_Tips.pdf
【解决方案2】:

在您的图像模型中,添加以下代码:

$hasAndBelongsToMany = 'Unit';

Images 控制器中的 find() 应如下所示:

$this->Image->find('all', array('conditions'=>array('Unit.id'=>29)));

仍然不太确定这是您要查找的内容,但我认为这是正确的。

【讨论】:

  • 试过了,在查询中给出了“SQL 错误:1054:'where 子句'中的未知列 'Unit.id'”:SELECT Image.id,Image.@987654328 @, Image.url FROM images AS Image WHERE Unit.id = 30
猜你喜欢
  • 2020-08-22
  • 2018-11-09
  • 1970-01-01
  • 2021-07-14
  • 2021-08-23
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 2011-03-24
相关资源
最近更新 更多