我正在尝试从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最后一个位置实际上是'tecnico'所以我需要找到一种方法来排除它显示在我的结果上。
答案 0 :(得分: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'
));
这样您只能从Location表中获取最后一个状态。然后,您可以迭代结果,按“名称”列进行过滤,并删除与“pendiente”不同的“名称”:
foreach($lastPendiente as $k => $location){
if($location['Location']['name'] != 'pendiente'){
unset($lastPendiente[$k]);
}