2

我正在尝试进行此查询

SELECT * FROM `rentprograms` AS `Rentprogram` 
    inner join `vehiclerentprograms` as  `Vehiclerentprogram` on `Vehiclerentprogram`.`rentprogramid` = `Rentprogram`.`id` 
    inner join `vehicles` AS `Vehicle` ON `Vehicle`.`id` =`Vehiclerentprogram`.`vehicleid` WHERE `Vehicle`.`id` = 1

CakePHP 中的代码

$this->Rentprogram->find('all'), array(
  'fields'=>array('*'),
  'joins' => array(
      array(
        'table' => 'vehiclerentprograms',
                'alias' => 'Vehiclerentprogram',
                'type'=>'inner',
                'conditions' => array(
                    'Vehiclerentprogram.rentprogramid' => 'Rentprogram.id',
                                )
                            ),
                array(
                'table' => 'vehicles',
                'alias' => 'Vehicle',
                'type'=>'inner',
                'conditions' => array(
                    'Vehicle.id' => 'Vehiclerentprogram.vehicleid',
                                )
                            )
                        ),
                    );

但它只显示 Rentprogram 的值。我怎样才能拥有与 Rentprogram、Vehicle、Vehiclerentprogram 相关的所有字段。

4

2 回答 2

1

使用 MVC 框架并手动进行脏连接没有任何价值。您最好使用 Cake 约定,它可以让您访问 Cake 的库和工具,从而大大加快开发过程。在这种情况下,您必须设置模型和模型之间的关联(我希望您听说过has-manybelongs-tomany-to-many等等)。

CakePHP 附带了一个非常宝贵的 DAO 层和一个名为bake的代码生成器。一旦您设计了数据库模式,就忘掉 SQL 并根据您的业务对象来思考。首先,在 MySQL 中创建三个表(我使用了最小的字段集并从您的查询中推断出结构):

CREATE TABLE `programs` (
  `id` int(11) AUTO_INCREMENT,
  `start` datetime DEFAULT NULL,
  `end` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `vehicles` (
  `id` int(11) AUTO_INCREMENT,
  `model` varchar(128) DEFAULT NULL,
  `plate` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `vehicle_programs` (
  `id` int(11) AUTO_INCREMENT,
  `program_id` int(11) DEFAULT NULL,
  `vehicle_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

然后运行shell脚本:

Console/cake bake all

并一次选择一张桌子(记住vehicle_programs必须是最后一张)。这将为您生成所有模型、控制器和视图文件。然后你可以开始用测试数据填充你的数据库。将您的浏览器指向http://host/vehicle_programs并放入一些车辆和程序。

最后,我将向您展示如何在一个查询中检索所有字段。假设您想在列出时显示所有内容vehicle_programs。在您必须设置为的index()方法中,以便它也获取相关的模型字段。在视图中,您现在可以访问如下字段VehicleProgramsController$this->VehicleProgram->recursive1index.ctp

<?php
foreach ($vehiclePrograms as $vehicleProgram) {
  echo $vehicleProgram['Program']['start'];
  echo $vehicleProgram['VehicleProgram']['id'];
  echo $vehicleProgram['Vehicle']['plate'];
}

请注意,如果我们没有设置Model->recursive1,Cake 将不会为我们获取相关模型 (VehicleProgram) 的字段。


顺便说一句,我认为根本不设置fields密钥应该可以解决问题,因为 Cake 默认会读取所有内容。但是,正确的解决方案是使用模型类之间的关系 - 当您运行bake它时,将以下内容放入Model/Vehicle.php

class Vehicle extends AppModel {

    public $hasMany = array(
        'VehicleProgram' => array(
            'className' => 'VehicleProgram',
            'foreignKey' => 'vehicle_id',
            'dependent' => false
        )
    );

}

和对称关联Model/VehicleProgram.php

于 2012-12-01T16:15:55.077 回答
0

你可以使用这个方法

$this->Rentprogram->find('all'), array(
 'fields' => array('Rentprogram.*', 'Vehicle.*', 'Vehiclerentprogram.*'), ...
于 2014-07-27T13:20:31.723 回答