2

CakePHP などは初めてで、次の問題に非常に混乱しているため、ガイダンスをいただければ幸いです。基本的に、私は hasAndBelongsToMany 関係に問題があり、1 つのコントローラーと 1 つのモデル内でほとんどの作業を行っているため、正しく行っているかどうかわかりません。

私にはクライアントのページがあり、クライアントには多くの仕事があり(これは機能します)、クライアントはクライアントタイプに属し(これは機能します)、クライアントにも多くのケーススタディがあり(これも機能します)、クライアントには仕事があります(問題ありません)。

ジョブには多くの分野があり、それらに属しています – これは機能しませんが、クエリが実行されているように見えます (デバッグ モードでの SQL 出力がこれを示しているため、SQL を直接 MySQL に実行しました - 正常にクエリされます)。クライアント配列にデータを提供していません。

これが私のクライアントモデルとコントローラーのコードです。

Client.php (モデル)

public $belongsTo = array(
        'ClientType' => array(
            'className' => 'ClientType',
            'foreignKey' => 'type_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

    public $hasMany = array(
        'CaseStudy' => array(
                'className' => 'CaseStudy',
                'foreignKey' => 'main_contractor',
                'conditions' => '',
                'fields' => '',
                'order' => ''
         ),
         'Job' => array(
                'className' => 'Job',
                'foreignKey' => 'client_id',
                'conditions' => '',
                'fields' => '',
                'order' => 'Job.id desc'
            )
    );

ClientsController.php (コントローラー)

$options['joins'] = array(
                array('table' => 'case_studies',
                        'alias' => 'CaseStudy',
                        'type' => 'LEFT',
                        'conditions' => array(
                                'CaseStudy.client_id = Client.id',
                        )
                ),
                array('table' => 'jobs',
                        'alias' => 'Job',
                        'type' => 'LEFT',
                        'conditions' => array(
                                'Job.client_id = Client.id',
                        )
                ),
                array('table' => 'sectors',
                        'alias' => 'Sector',
                        'type' => 'LEFT',
                        'conditions' => array(
                                'Job.sector_id = Sector.id',
                        )
                ),
                array('table' => 'disciplines_jobs',
                        'alias' => 'DisciplinesJobs',
                        'type' => 'LEFT',
                        'conditions' => array(
                                'Job.id = DisciplinesJobs.job_id',                          
                        )
                ),
                array(
                        'table' => 'disciplines',
                        'alias' => 'Discipline',
                        'type' => 'LEFT',
                        'conditions' => array(
                                'DisciplinesJobs.discipline_id = Discipline.id'
                        )
                )
        );

        $options['conditions'] = array('Client.id' => $client_id);

        $clients = $this->Client->find('all', $options);

上記の $clients 配列の出力:

array(
    (int) 0 => array(
        'Client' => array(
            'id' => '47',
            'type_id' => '2',
            'name' => 'Balfour Beatty',
            'logo' => '1361786198_thumbnail_balfour beatty.jpg',
            'website_url' => 'http://www.google.com',
            'date_added' => '2013-02-25 10:56:38',
            'date_modified' => '2013-02-25 10:56:38'
        ),
        'ClientType' => array(
            'id' => '2',
            'name' => 'Constructors'
        ),
        'CaseStudy' => array(
            (int) 0 => array(
                'id' => '23',
                'client_id' => '47',
                'sector_id' => '1',
                'name' => 'Shoreham Academy',
                'header_image' => '1365088787_thumbnail_1365088787_header copy.jpg',
                'main_contractor' => '47',
                'architect' => 'Architecture PLB',
                'project_value' => '565000',
                'scope_of_works' => '<table></table>',
                'text' => '<p><</p>',
                'type' => 'flooring',
                'date_added' => '2013-04-04 11:19:47',
                'date_modified' => '2013-04-04 11:19:47'
            )
        ),
        'Job' => array(
            (int) 0 => array(
                'id' => '1',
                'client_id' => '47',
                'sector_id' => '2',
                'project' => 'Shoreham Academy (Project not case study)',
                'date' => '2012-10-19',
                'cost' => '&pound;416k',
                'quantity_of_flooring' => '7000m',
                'date_added' => '2013-08-06 21:46:59',
                'date_modified' => '2013-08-06 21:47:01'
            )
        )
    )

上記の $clients 配列には、discipline_jobs テーブルからの分野データが含まれていませんが、正常に実行された SQL 出力は次のとおりです。

SELECT `Client`.`id`, `Client`.`type_id`, `Client`.`name`, `Client`.`logo`, `Client`.`website_url`, `Client`.`date_added`, `Client`.`date_modified`, `ClientType`.`id`, `ClientType`.`name` 
FROM `ar_flooring`.`clients` AS `Client` 
LEFT JOIN `ar_flooring`.`case_studies` AS `CaseStudy` ON (`CaseStudy`.`client_id` = `Client`.`id`) 
LEFT JOIN `ar_flooring`.`jobs` AS `Job` ON (`Job`.`client_id` = `Client`.`id`) 
LEFT JOIN `ar_flooring`.`sectors` AS `Sector` ON (`Job`.`sector_id` = `Sector`.`id`)   
LEFT JOIN `ar_flooring`.`disciplines_jobs` AS `DisciplinesJobs` ON (`Job`.`id` = `DisciplinesJobs`.`job_id`) LEFT JOIN `ar_flooring`.`disciplines` AS `Discipline` ON (`DisciplinesJobs`.`discipline_id` = `Discipline`.`id`) 
LEFT JOIN `ar_flooring`.`client_types` AS `ClientType` ON (`Client`.`type_id` = `ClientType`.`id`) 
WHERE `Client`.`id` = 47

規律モデルやコントローラーを持っていません。クライアント モデルとコントローラーを使用してすべてを実行しようとしているため、ジョブ モデルまたはコントローラーがありません。これは正しいですか?

なぜこれが起こっているのか誰にも分かりますか?

これが理にかなっていることを願っています。

乾杯!

4

1 に答える 1

0

実行したいようです

$this->Client->find('all') 

ClientsController で。

そのfind allでは、クライアントのリスト、各クライアントが属するClientType、各クライアントが持つCaseStudyリスト、各クライアントが持つジョブリスト、および各ジョブが持つ専門分野を取得する必要があります。

まず、CakePHP の実践者として、私はほとんど常に habtm 関係を使用することを避けています。

その理由は、ほとんどの場合、結合テーブルに余分なフィールドがあるためです。この場合、jobs_disciplinesは と だけではない可能性がjob_idありdiscipline_idます。という名前の別のフィールドもあるかもしれませんstatus

私がすることは、JobsDiscipline モデルと Discipline モデルを焼き上げることです。

JobsDiscipline は、Discipline と Job の両方に属します。

Discipline と Job の両方に多くの JobsDiscipline があります。

この後、構築するクエリは基本的には

$this->Client->find('all', array(
  'contain' => array('ClientType', 'CaseStudy', 'Job' => array('JobsDiscipline'=>array('Discipline')))
));

これは、AppModel で再帰を -1 に設定した場合でも機能するはずです。

これでうまくいかない場合は、もう一度お知らせください。

于 2013-10-14T05:15:39.693 に答える