CakePHP:如何更改此查找调用以包括关联表中不存在的所有记录?

时间:2010-05-30 18:51:10

标签: php mysql cakephp join containable

我有几张表有以下关系:

公司拥有多个工作,员工和卡车,用户

我已经正确设置了所有外键,以及表格的模型,控制器和视图。

最初,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'));
      )
    )
  )
)));

现在,自编写此代码以来,我决定在工作分配方面做更多工作。所以我创造了一个属于“卡车”并属于“工作”的新模型“作业”。我已将hasMany Assignments添加到Truck模型和Jobs模型中。我在赋值表中有两个外键,以及其他一些赋值字段。

现在,我正在尝试获取上面相同的信息,而不是检查作业表中指定的字段,我想检查赋值表以确保该作业不存在。如果由于mysql错误我将使用find方法的“连接”功能(根据cookbook),我不能再使用可包含的行为。但是,以下查询将返回所有作业,即使它们属于不同的日期。

$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'
)
)));

编辑:事实证明,我的查询有效,我的数据出现问题导致所有作业都被退回。

2 个答案:

答案 0 :(得分:1)

我的查询没有错。事实证明,有一个数据问题阻止我正确过滤分配。

答案 1 :(得分:-1)

Rember这个条件将在JOIN查询中转换为ON,在那里你需要一个WHERE somefield!= somevalue种类的条件,在find方法中使用条件数组(参见find中的条件)
$this->Modelname->find('type',array=('conditions' => array('somefiled !=' => $value,'somemorefield <>' => $value)));