2012-12-01 72 views
2

我想有這個疑問加入CakePHP中沒有顯示

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相關的所有字段。

回答

1

使用MVC框架沒有價值,並且髒手加入。你最好使用Cake的約定,它允許你訪問Cake的庫和工具,這反過來又加速了開發過程。在這種情況下,你必須設置模型關聯模型之間(我希望你聽到具有一對多的,屬於對許多一對多等)。

CakePHP附帶一個無價的DAO層和一個名爲的代碼生成器。一旦你設計了數據庫模式,忘記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->recursive設置爲1,以便它也提取相關的模型字段。在視圖index.ctp你現在就可以訪問像

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

註釋字段,如果我們沒有設置Model->recursive1,蛋糕不會有相關的模型(VehicleProgram)爲我們的牽強領域。


順便說一句,我覺得不設置fields鍵都應該做的伎倆,因爲蛋糕讀取默認一切。然而,正確的解決辦法是使用模型類之間的關係 - 當你運行bake它把下面的Model/Vehicle.php

class Vehicle extends AppModel { 

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

} 

和對稱協會Model/VehicleProgram.php

0

您可以使用此方法

$this->Rentprogram->find('all'), array(
'fields' => array('Rentprogram.*', 'Vehicle.*', 'Vehiclerentprogram.*'), ...