繁体   English   中英

联接表的最有效方法

[英]Most efficient way to join tables

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

零件是一个简单的模型,具有一个ID列,并包含多个字段,例如客户零件号描述等。每个零件都有其自己的唯一ID。

订单是另一个简单的模型,具有一个名为* part_id *的字段,该字段表示零件模型中的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个订单,因此我需要一种有效的方法来在“ 零件”数据库中引用每个订单的* part_id *并将其合并为一个数组。 我不确定如何有效实现它多次搜索零件数据库。

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

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

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

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

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

如果需要特殊查询,也可以“手动”设置查询的联接,但需要将递归设置为-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')))))

祝好运!

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

Imo客户信息应该是订单的一部分,而不是部分。 另外,您可能希望订单包含多个零件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM