我正在尝试进行此查询
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相关的所有领域。
答案 0 :(得分:1)
使用MVC框架并且手动执行脏连接没有任何价值。您最好使用Cake约定,它允许您访问Cake的库和工具,这反过来又加速了开发过程。在这种情况下,您必须在模型之间设置模型和关联(我希望您听说过 has-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()
的{{1}}方法中,您必须将VehicleProgramsController
设置为$this->VehicleProgram->recursive
,以便它也会获取相关的模型字段。在视图1
中,您现在可以访问
index.ctp
请注意,如果我们没有将<?php
foreach ($vehiclePrograms as $vehicleProgram) {
echo $vehicleProgram['Program']['start'];
echo $vehicleProgram['VehicleProgram']['id'];
echo $vehicleProgram['Vehicle']['plate'];
}
设置为Model->recursive
,那么Cake就不会获取相关模型的字段(1
和Vehicle
)我们。
顺便说一下,我认为不设置Program
密钥应该可以解决问题,因为Cake默认会读取所有内容。但是,正确的解决方案是使用模型类之间的关系 - 当您运行fields
时,它会将以下内容放在bake
中:
Model/Vehicle.php
和class Vehicle extends AppModel {
public $hasMany = array(
'VehicleProgram' => array(
'className' => 'VehicleProgram',
'foreignKey' => 'vehicle_id',
'dependent' => false
)
);
}
答案 1 :(得分:0)
您可以使用此方法
$this->Rentprogram->find('all'), array(
'fields' => array('Rentprogram.*', 'Vehicle.*', 'Vehiclerentprogram.*'), ...