2012-11-01 71 views
1

我试图从hasMany和belongsTo关联链接的两个表中拉出一些信息。Cakephp 2.0:复杂查找查询

申请的hasMany位置和地点属于关联征用

TABLE `requisitions` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`user_id` int(11) NOT NULL, 
`fecha_generacion` date NOT NULL, 
`solicitado_a` varchar(60) NOT NULL, 
`proyecto` varchar(150) NOT NULL, 
`obra_no` varchar(11) NOT NULL, 
`observaciones` text NOT NULL, 
PRIMARY KEY (`id`) 
) 

and 
    TABLE `locations` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `requisition_id` int(11) NOT NULL, 
    `fecha` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    `name` enum('pendiente','tecnico','existencia','cotizando','generar_o','archivada') 
    NOT NULL DEFAULT 'pendiente', 
    `image_path` varchar(150) NOT NULL DEFAULT 'estado0.png', 
    `note` text NOT NULL, 
    PRIMARY KEY (`id`) 
) 

申请从一个地方转到另一个,我需要通过一个给定的位置为“pendiente”,“TECNICO”来跟踪其当前位置的期待.. 因此,我需要为每个申请生成一个带有最后一个位置的列表,然后通过Location来筛选该列表。

我相信唯一能做到这一点的方法是围绕另一个查询进行查询,所以我试图首先用更简单的查询来理解cakephp语法。

我正在尝试从我的RequisitionsController中搜索最后一个'pendiente'位置,并显示下一个代码。

$lastPendiente = $this->Requisition->Location->find('all', array(
'conditions' => array('Location.name' => 'pendiente'), 
    'fields' => array('MAX(Location.id) AS olderLocation', 'Location.requisition_id'), 
    'group' => 'Requisition.id', 
    )); 

我有查询

SELECT MAX(`Location`.`id`) AS olderLocation, `Location`.`requisition_id` FROM `petrofil_demo`.`locations` AS `Location` LEFT JOIN `petrofil_demo`.`requisitions` AS `Requisition` ON (`Location`.`requisition_id` = `Requisition`.`id`) WHERE `Location`.`name` = 'pendiente' GROUP BY `Requisition`.`id` 

输出...

array(
    (int) 0 => array(
     (int) 0 => array(
      'olderLocation' => '22' 
     ), 
     'Location' => array(
      'requisition_id' => '29' 
     ) 
    ), 
    (int) 1 => array(
     (int) 0 => array(
      'olderLocation' => '5' 
     ), 
     'Location' => array(
      'requisition_id' => '30' 
     ) 
    ), 
    (int) 2 => array(
     (int) 0 => array(
      'olderLocation' => '13' 
     ), 
     'Location' => array(
      'requisition_id' => '31' 
     ) 
    ) 
) 

...因为那些正是以“pendiente的位置,但这里的最后申请,这是伟大来了第二个查询或我无能为力的情况。我需要确定我的申请最后一个状态是'pendiente',而不是另一个可能的位置。例如,我的requisition_id => 30最后一个地点确实是'tecnico',所以我需要找到一种方法将其排除在我的结果上。

回答

0

你可以从查询退出条件,把“名称”列中的“字段”和句子添加订单:

$lastPendiente = $this->Requisition->Location->find('all', array(
    'fields' => array('MAX(Location.id) AS olderLocation', 'Location.requisition_id', 'name'), 
    'group' => 'Requisition.id', 
    'order' => 'fecha DESC' 
    )); 

这样,你只能从位置表的最后状态。然后,您可以迭代结果,按'姓名'列过滤并删除与'pendiente'不同的'姓名':

foreach($lastPendiente as $k => $location){ 
if($location['Location']['name'] != 'pendiente'){ 
    unset($lastPendiente[$k]); 
}