0

私は CakePHP 2.7.8 でサービス要求アプリケーションに取り組んでいます。ユーザーのエリアで要求されたサービスを提供しているクライアントのリストを表示する必要があります。

このためにservice_requests、ユーザーが行ったリクエストを追跡するためのテーブルをデータベースに用意しています。

CREATE TABLE `service_requests` (
  `id` char(36) NOT NULL,
  `customer_id` char(36) DEFAULT NULL,
  `customer_address_id` char(36) DEFAULT NULL,
  `service_id` char(36) DEFAULT NULL,
  `service_area_id` char(36) DEFAULT NULL,
  `status_code` int(11) DEFAULT NULL,
  `status` varchar(30) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
)

ここservice_idで とservice_area_idは、それぞれ 2 つの異なるモデルservicesとの外部キーであることに注意してくださいservice_areas

サービス.sql

CREATE TABLE `services` (
  `id` char(36) NOT NULL,
  `title` varchar(45) DEFAULT NULL,
  `description` text,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
)

およびservice_areas.sql

CREATE TABLE `service_areas` (
  `id` char(36) NOT NULL,
  `postal_id` char(36) DEFAULT NULL,
  `area_name` varchar(45) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `postal_id_idx` (`postal_id`)
)

クライアント (サービス プロバイダー) によって提供されるサービスのリストを保持する別のテーブルがあります。

CREATE TABLE `client_services` (
  `id` char(36) NOT NULL COMMENT '      ',
  `client_id` char(36) DEFAULT NULL,
  `service_id` char(36) DEFAULT NULL,
  `charge` float DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `client_id_idx` (`client_id`),
  KEY `service_id_idx` (`service_id`)
)

サービスプロバイダーの対象となるサービスエリアのリストを維持するための別のテーブル。

CREATE TABLE `client_service_areas` (
  `id` char(36) NOT NULL,
  `client_id` char(36) DEFAULT NULL,
  `service_area_id` char(36) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `client_id_idx` (`client_id`),
  KEY `service_area_id_idx` (`service_area_id`)
) 

serviceRequest モデル: serviceRequest.php

class ServiceRequest extends AppModel {

    public $displayField = 'status';

/**
 * belongsTo associations
 *
 * @var array
 */
    public $belongsTo = array(
        'Customer' => array(
            'className' => 'Customer',
            'foreignKey' => 'customer_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'CustomerAddress' => array(
            'className' => 'CustomerAddress',
            'foreignKey' => 'customer_address_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Service' => array(
            'className' => 'Service',
            'foreignKey' => 'service_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'ServiceArea' => array(
            'className' => 'ServiceArea',
            'foreignKey' => 'service_area_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );
}

view以下にアクセスしてアクションを要求する場合:

http://localhost/service_requests/view/<service_request_id>

service_requests からの結果を表示します

サービス リクエスト ビュー アクション

ここで私がしたいことは、要求されたサービス エリアで要求されたサービスを提供するクライアントの名前を含むリストをこのビューの下に表示することです(同じサービス エリアで同じサービスを提供する多くのサービス プロバイダーが存在する可能性があります)。

これは、サービスを提供するクライアントのリストを表示することを意味しCarpenterますGhaziabad

クライアントの名前とその他の詳細は、テーブルから取得されclientsます。

4

2 に答える 2

1

これはあなたのデータモデルです:

ここに画像の説明を入力

clientsと で結合しclient_services、 とclient_service_areasでフィルタリングしservice_idservice_area_idでグループ化することで、必要な情報を取得できますclients.id

以下が機能するはずです。

public function view($id){

    // retrieve ServiceRequest data 
    $serviceRequest = $this->ServiceRequest->findById($id);

    // retrieve Client data        
    $options['joins'] = array(
        array('table' => 'client_services',
            'alias' => 'ClientService',
            'type' => 'INNER',
            'conditions' => array(
                'Client.id = ClientService.client_id',
            )
        ),
        array('table' => 'client_service_areas',
            'alias' => 'ClientServiceArea',
            'type' => 'INNER',
            'conditions' => array(
                'Client.id = ClientServiceArea.client_id',
            )
        ),

    );

    $options['conditions'] = array(
        'ClientService.service_id'=>$serviceRequest['ServiceRequest']['service_id'],
        'ClientServiceArea.service_area_id'=>$serviceRequest['ServiceRequest']['service_area_id']
    );

    $options['group'] = array('Client.id');

    $Client = ClassRegistry::init('Client');
    $clients = $Client->find('all', $options);
    $this->set(compact('serviceRequest','clients'));
}

注: 上記のコードはテストされておらず、エラー処理がありません

于 2016-01-30T11:33:00.617 に答える