【问题标题】:Cakephp 2.0: complex find queryCakephp 2.0:复杂的查找查询
【发布时间】:2012-10-21 18:26:04
【问题描述】:

我试图从 hasMany 和 belongsTo 关联的两个表中提取一些信息。

申请有许多位置和位置属于申请

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.name 过滤该列表

我相信做到这一点的唯一方法是围绕另一个查询进行查询,所以我试图先通过更简单的查询来理解 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 last location 确实是“tecnico”,所以我需要找到一种方法将其排除在我的结果中。

【问题讨论】:

    标签: php sql cakephp


    【解决方案1】:

    您可以从查询中退出条件,将“名称”列放在“字段”中并逐句添加顺序:

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

    这样您只能从 Location 表中获取最后一个状态。然后,您可以迭代结果,按“名称”列过滤并删除那些与“pendiente”不同的“名称”:

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

    【讨论】:

      猜你喜欢
      • 2012-04-12
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 2012-03-30
      相关资源
      最近更新 更多