2

モデルでこれらの関係を定義しました。

リードhasManyJobJob
HABTM Employee
Job HABTM Truck

私はfind('all')自分のトラックモデルからを実行しようとしていますが、結果を次のように制限しています。

  1. すべてのトラック、
  2. 特定の集荷日があるトラックに関連するすべてのジョブ、
  3. それらの仕事に割り当てられた従業員、
  4. と仕事に関連付けられているリード。

これが私の検索操作です:

// app/models/truck.php
$this->find('all', array(
    'contain' => array(
        'Job' => array(
            'Employee',
            'Lead',
            'conditions' => array(
                'Job.pickup_date' => $date
            )
        )
    )
));

何らかの理由で、Cakeは従業員を2回見つけるためにクエリを実行します。これにより、すべての従業員が各ジョブに対して2回代表されることになります。SQLダンプは次のとおりです。

  1. SELECT `Truck`.`id`, `Truck`.`truck_number`
    FROM   `trucks` AS `Truck`
    WHERE  1 = 1;
  2. SELECT `Job`.`id`, `Job`.`lead_id`, `Job`.`city`,
           `JobsTruck`.`id`, `JobsTruck`.`job_id`, `JobsTruck`.`truck_id`
    FROM   `jobs` AS `Job`
    JOIN   `jobs_trucks` AS `JobsTruck` ON (`JobsTruck`.`truck_id` IN (2, 3)
    AND    `JobsTruck`.`job_id` = `Job`.`id`)
    WHERE  `Job`.`pickup_date` = '2010-10-06'
  3. SELECT `Lead`.`id`, `Lead`.`name`, `Lead`.`created` FROM `leads` AS `Lead`
    WHERE  `Lead`.`id` = 4
  4. SELECT `Employee`.`id`, `Employee`.`name`, `Employee`.`created`,
           `EmployeesJob`.`id`, `EmployeesJob`.`employee_id`,
           `EmployeesJob`.`job_id`
    FROM   `employees` AS `Employee`
    JOIN   `employees_jobs` AS `EmployeesJob`
           ON (
               `EmployeesJob`.`job_id` = 1 AND
               `EmployeesJob`.`employee_id` = `Employee`.`id`
           )
  5. SELECT `Lead`.`id`, `Lead`.`name`, `Lead`.`created` FROM `leads` AS `Lead`
    WHERE  `Lead`.`id` = 4
  6. SELECT `Employee`.`id`, `Employee`.`name`, `Employee`.`created`,
           `EmployeesJob`.`id`, `EmployeesJob`.`employee_id`,
           `EmployeesJob`.`job_id`
    FROM   `employees` AS `Employee`
    JOIN   `employees_jobs` AS `EmployeesJob`
           ON (
               `EmployeesJob`.`job_id` = 1 AND
               `EmployeesJob`.`employee_id` = `Employee`.`id`
           )

最後の2つのクエリが重複していることに注意してください。私が行方不明になっている何か間違ったことをしましたか?

更新
Cakeはすべてのトラックに対して重複したクエリを送信しているようです。トラックテーブルに15個のレコードがあるので、クエリとへのクエリleadsemployeesそれぞれ15回複製されます。

4

3 に答える 3

3

2つのクエリが重複している理由はわかりませんが、この動作が役立つ可能性があります。

https://github.com/Terr/linkable

アップデート

この種の問題はよく知られています。

于 2010-11-20T21:19:44.460 に答える
1

Job/s見つかったものを特定のものに結合するものはありませんTruck

(私の説明が理解しにくいものではないことを願っていますが、CakePHPは時々そのようになる可能性があります!imho)

はほぼ恣意的な方法でJobsに起因していますTrucks(Cakeの私の記憶はこれが起こる可能性があるということです)。HABTM呼び出しの性質によりJob/s、15のそれぞれにが付加されTrucksます。これは私の観点からは現在のプロセスのようです。

  • すべてのトラックを入手してください。
  • 日付がxであるトラックのすべてのジョブを取得します。
  • [問題1]見つかっJobsたものをそれぞれTruck(つまり、15台のトラック)に取り付けますが、すべてに取り付けますTruck
  • [問題2]そのジョブに関連するすべてのリード/従業員をそれぞれについて取得しますTruck

問題1:問題の原因。2番目のクエリ(SELECT Job...)で確認できます。ここでは、ONステートメントで正しい'を使用していますが、Cakeは別のクエリであるため、これらを右にtruck_id「結合」することはできません。したがって、見つかったジョブをそれぞれに結合します。JobsTruckTruck

問題2:これは「実際の」問題です。Cakeは長いJOINステートメントを作成しないため、必要なものだけのEmployees/を見つける方法はありません。これが、トラックごとにそれらを見つける理由です。これは、を実行しているためです。LeadsTrucksFindAllTruck

それが理にかなっていることを願っています。クエリの「中心」(pickup_date)であるためJobs、すべてを検索する必要があります。

$this->loadModel('Job');
$whatev = $this->Job->find('all', array(
    'contain' => array(
        'Job' => array(
            'Truck',
            'Employee',
            'Lead',
            'conditions' => array(
                'Job.pickup_date' => $date
            )
        )
    )
));

CakePHPクエリは、実際には特定のモデルの1つまたはすべてを見つけた場合にのみ機能します。二重のHABTM関係がある場合は、途中から始めてどちらかの側で機能することをお勧めします。トラックで「並べ替え」たい場合は、タスクを自分で実行するために独自のクエリ(モデルメソッド)を作成する必要がある場合があります。生のSQLでは、このクエリは簡単かもしれませんが、抽象化されたPHPのスーパーケーキネスでは、CakePHPではこれを許可するのは困難です。

彼らが言うように、ハッピーベーキング!

于 2010-11-24T15:28:10.007 に答える
-3

JOINの代わりにLEFTJOINが必要です。

Cakephpでそれを行う方法を私に聞かないでください、私は私のコードが現在機能していることを嬉しく思います。^^

于 2010-11-22T20:11:58.913 に答える