CakePHP:显示来自多个模型的数据
CakePHP : display data from multiple models
我正在 CakePHP 2.7.8 上开发服务请求应用程序。
我必须显示在用户区域提供请求服务的客户列表。
为此,我在数据库中有一个 service_requests
table 来跟踪用户提出的请求。
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
分别是两个不同模型的外键services
和service_areas
services.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`)
)
我还有另一个 table 来维护客户(服务提供商)提供的服务列表。
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`)
)
和另一个 table 维护服务提供商涵盖的服务区域列表。
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.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
的结果
现在我要做的是在此视图下方显示一个列表,其中包含在请求的服务区域提供请求的服务的客户名称(可以有许多服务提供商在同一服务区域提供相同的服务).
这意味着在 Ghaziabad
中显示为 Carpenter
提供服务的客户列表
客户的姓名和其他详细信息来自 clients
table。
我认为您需要此代码。
$query = $articles->find('all')
->where(['Articles.created >' => new DateTime('-10 days')])
->contain(['Comments', 'Authors'])
->limit(10);
你可以研究这个link
这是您的数据模型:
您可以通过将 clients
与 client_services
和 client_service_areas
连接起来,按 service_id
和 service_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'));
}
注意:以上代码未经测试,缺少错误处理
我正在 CakePHP 2.7.8 上开发服务请求应用程序。 我必须显示在用户区域提供请求服务的客户列表。
为此,我在数据库中有一个 service_requests
table 来跟踪用户提出的请求。
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
分别是两个不同模型的外键services
和service_areas
services.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`)
)
我还有另一个 table 来维护客户(服务提供商)提供的服务列表。
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`)
)
和另一个 table 维护服务提供商涵盖的服务区域列表。
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.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
的结果现在我要做的是在此视图下方显示一个列表,其中包含在请求的服务区域提供请求的服务的客户名称(可以有许多服务提供商在同一服务区域提供相同的服务).
这意味着在 Ghaziabad
Carpenter
提供服务的客户列表
客户的姓名和其他详细信息来自 clients
table。
我认为您需要此代码。
$query = $articles->find('all')
->where(['Articles.created >' => new DateTime('-10 days')])
->contain(['Comments', 'Authors'])
->limit(10);
你可以研究这个link
这是您的数据模型:
您可以通过将 clients
与 client_services
和 client_service_areas
连接起来,按 service_id
和 service_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'));
}
注意:以上代码未经测试,缺少错误处理