次の関係を持つテーブルがいくつかあります。
会社には多くの仕事、従業員、トラック、ユーザーがいます
テーブルのモデル、コントローラー、およびビューとともに、すべての外部キーを適切に設定しました。
元々、Jobsテーブルには「assigned」と呼ばれるブールフィールドがありました。次の検索操作(JobsControllerから)は、すべての従業員、すべてのトラック、および割り当てられておらず、単一の会社の特定の日に該当するすべてのジョブを正常に返します(包含可能な動作を利用してユーザーを返すことはありません)。
$this->set('resources', $this->Job->Company->find('first', array(
'conditions' => array(
'Company.id' => $company_id
),
'contain' => array(
'Employee',
'Truck',
'Job' => array(
'conditions' => array(
'Job.assigned' => false,
'Job.pickup_date' => date('Y-m-d', strtotime('Today'));
)
)
)
)));
さて、このコードを書いたので、私は仕事の割り当てでもっと多くのことをすることにしました。そこで、belongsToTruckとbelongsToJobという新しいモデル「Assignment」を作成しました。トラックモデルとジョブモデルの両方にhasMany割り当てを追加しました。割り当てテーブルには、他のいくつかの割り当てフィールドとともに、両方の外部キーがあります。
今、私は上記と同じ情報を取得しようとしていますが、ジョブテーブルから割り当てられたフィールドをチェックする代わりに、割り当てテーブルをチェックして、ジョブがそこに存在しないことを確認したいと思います。mysqlエラー(クックブックによる)が原因で、findメソッドの「結合」機能を使用する場合、包含可能な動作を使用できなくなります。ただし、次のクエリは、異なる日に分類される場合でも、すべてのジョブを返します。
$this->set('resources', $this->Job->Company->find('first', array(
'joins' => array(
array(
'table' => 'employees',
'alias' => 'Employee',
'type' => 'LEFT',
'conditions' => array(
'Company.id = Employee.company_id'
)
),
array(
'table' => 'trucks',
'alias' => 'Truck',
'type' => 'LEFT',
'conditions' => array(
'Company.id = Truck.company_id'
)
),
array(
'table' => 'jobs',
'alias' => 'Job',
'type' => 'LEFT',
'conditions' => array(
'Company.id = Job.company_id'
)
),
array(
'table' => 'assignments',
'alias' => 'Assignment',
'type' => 'LEFT',
'conditions' => array(
'Job.id = Assignment.job_id'
)
)
),
'conditions' => array(
'Job.pickup_date' => $day,
'Company.id' => $company_id,
'Assignment.job_id IS NULL'
)
)));
編集:結局のところ、私のクエリは機能しますが、すべての割り当てが返される原因となるデータに問題がありました。