1

hasMany アソシエーションと belongsTo アソシエーションによってリンクされた 2 つのテーブルから情報を取得しようとしています。

求人には多くの場所があり、場所は求人に属しています

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`)
) 

要求はある場所から別の場所に移動し、特定の場所を「ペンディエンテ」、「テクニコ」として見て、現在の場所を追跡する必要があります...したがって、各要求の最後の場所を含むリストを生成し、フィルタリングする必要がありますLocation.nameによるそのリスト

これを行う唯一の方法は、別のクエリの周りにクエリを使用することだと思うので、最初に、より単純なクエリを使用して CakePHP の構文を理解しようとしています。

RequisitionsController からの次のコードを使用して、最後の「ペンディエンテ」の場所を検索しようとしていました。

$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'
        )
    )
)

...これは素晴らしいことです。なぜなら、これらはまさに「ペンディエンテ」の場所を持つ最後の要求だからですが、ここでは 2 番目のクエリまたは私が無知な状態です。要求の最後の状態が「ペンディエンテ」であり、別の可能な場所ではないことを確認する必要があります。たとえば、私の requisition_id =>30 最後の場所は実際には「tecnico」であるため、結果に表示されないようにする方法を見つける必要があります。

4

1 に答える 1

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 テーブルから最後のステータスのみを取得します。次に、結果を繰り返し、「名前」列でフィルタリングし、「ペンディエンテ」とは異なる「名前」を削除します。

foreach($lastPendiente as $k => $location){
if($location['Location']['name'] != 'pendiente'){
    unset($lastPendiente[$k]);
}
于 2012-11-12T16:12:40.813 に答える