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-to多対多などについて聞いたことがあると思います)。

CakePHP には、非常に貴重な DAO レイヤーと、 akeと呼ばれるコード ジェネレーターが同梱されています。データベース スキーマを設計したら、SQL のことは忘れて、ビジネス オブジェクトの観点から考えてください。まず、MySQL で 3 つのテーブルを作成します (最小限のフィールド セットを使用し、クエリから構造を推測しました)。

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`)
);

次に、シェル スクリプトを実行します。

Console/cake bake all

一度に 1 つのテーブルを選択します (vehicle_programs最後のテーブルでなければならないことに注意してください)。これにより、すべてのモデル、コントローラー、およびビューのファイルが生成されます。次に、データベースにテスト データを入力し始めることができます。ブラウザをポイントして、http://host/vehicle_programs車両とプログラムを入れます。

最後に、1 つのクエリですべてのフィールドを取得する方法を示します。をリストするときにすべてを表示したいとします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->recursiveに設定していなければ1、Cake は関連するモデル (Vehicleおよび) のフィールドを取得していないことに注意Programしてください。


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 に答える