【问题标题】:Most efficient way to join tables连接表的最有效方法
【发布时间】:2011-06-17 15:53:25
【问题描述】:

我在cakePHP中有两个模型,一个是Parts,一个是Orders

Parts 是一个简单的模型,有一个 id 列 plusaction 多个字段,如 customerpart numberdescription 等。每个部分都有自己的自己的唯一 ID。

Orders 是另一个简单的模型,其中有一个名为 *part_id* 的字段,它表示 Parts 模型中的一个 id。

在一个动作中,在 Orders 控制器中,我需要提取该特定视图的所有订单,从 Parts 数据库中找到有关该订单的信息并将其放入一起放在一个数组中,准备好传递给视图。

例如,表格可能如下所示:

ORDERS

Part_id   id
2         5
1         7

PARTS

customer  partnumber  description    id
Google    XHA-V1      widget_1       1
Yahoo     YVS-XN      widget_5       2

由于我在任何一个视图中都会有 50-100 个订单,因此我需要一种有效的方法来引用 Parts 数据库中每个订单的 *part_id* 并将其组合成一个数组。它多次搜索 Parts 数据库,我不确定如何有效地实现。

注意:我想解决方案可能是蛋糕或纯 PHP。

【问题讨论】:

  • 是内置cakephp模型关联太慢还是怎么回事?还是您尚未实施的可能解决方案?

标签: php arrays cakephp find


【解决方案1】:

如果您在订单模型中正确定义了关系,您应该能够检索所有相应的零件

$this->Orders->find('all');

cakephp 将在两个查询中执行此操作: - 所有订单的 SELECT - product.id 位于 (list_of_Orders_ids) 中的所有产品的 SELECT

然后它将以适当的格式构造一个数组

如果您需要特殊查询,您也可以“手动”设置查询的连接,但您需要将递归设置为 -1

$this->Orders->find('all',array('recursive'=>-1,
                                'fields'=>array('Order.*','Part.*'),
                                'joins'=>array(array('table' => 'parts',
                                                     'alias' => 'Part',
                                                     'type' => 'INNER', //or left
                                                     'conditions' => array('Part.id = Order.part_id')))))

祝你好运!

【讨论】:

    【解决方案2】:

    您可以使用控制器中的$this->Order->find('all', array('recursive' => 2)); 获取(所有)订单数组。每个订单还包含相关的零件信息。

    Imo 客户信息应该是订单的一部分,而不是一部分。此外,您可能希望订单由多个部分组成。

    【讨论】:

      猜你喜欢
      • 2014-12-06
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多