加入cakephp不显示所有数据

时间:2012-12-01 15:14:15

标签: cakephp-2.0

我正在尝试进行此查询

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相关的所有领域。

2 个答案:

答案 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就不会获取相关模型的字段(1Vehicle)我们。


顺便说一下,我认为不设置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.*'), ...