1

我有一些具有以下关系的表:

公司有许多工作、员工和卡车、用户

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

最初,Jobs 表有一个名为“assigned”的布尔字段。以下 find 操作(来自 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 分配添加到 Truck 模型和 Jobs 模型。我在分配表中有两个外键,以及其他一些分配字段。

现在,我试图获取上面相同的信息,只是不想检查作业表中的分配字段,而是要检查分配表以确保该作业不存在。如果由于 mysql 错误(根据说明书)而要使用 find 方法的“joins”功能,我将无法再使用可包含的行为。但是,以下查询会返回所有工作,即使它们属于不同的日期。

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

编辑:事实证明,我的查询有效,我的数据存在问题,导致所有分配都被返回。

4

2 回答 2

1

我的查询没有任何问题。原来有一个数据问题阻止我正确过滤分配。

于 2010-07-12T12:11:56.350 回答
-1

请记住,此条件将在 JOIN 查询中转换为 ON,如果您需要 WHERE somefield != somevalue 类型的条件,请在 find 方法中使用条件数组(请参阅 find 中的条件)

$this->Modelname->find('type',array=('conditions' => array('somefiled !=' => $value,'somemorefield <>' => $value)));

于 2010-06-04T07:42:16.827 回答