CakePHP: Как я могу изменить этот вызов поиска, чтобы включить все записи, которые не существуют в связанной таблице? - PullRequest
1 голос
/ 30 мая 2010

У меня есть несколько таблиц со следующими отношениями:

Компания имеет много рабочих мест, сотрудников и грузовиков, пользователей

У меня настроены все внешние ключи, а также таблицы, модели, контроллеры и представления.

Первоначально в таблице Jobs было логическое поле с именем "назначено". Следующая операция поиска (из 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. У меня есть оба внешних ключа в таблице назначений, а также некоторые другие поля назначения.

Теперь я пытаюсь получить ту же информацию выше, только вместо того, чтобы проверять назначенное поле из таблицы заданий, я хочу проверить таблицу назначений, чтобы убедиться, что задания там не существует. Я больше не могу использовать сдерживаемое поведение, если я собираюсь использовать функцию «соединения» метода find из-за ошибок mysql (согласно поваренной книге). Но следующий запрос возвращает все задания, даже если они выпадают в разные дни.

$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 ]

1 голос
/ 12 июля 2010

С моим запросом все в порядке. Оказывается, была проблема с данными, мешающая мне правильно фильтровать назначения.

0 голосов
/ 04 июня 2010

Помните, что это условие будет транслироваться в ON в запросе JOIN, где, когда вам нужно условие WHERE somefield! = Somevalue, используйте массив условий (см. Условия в find) в методе find
<br> $this->Modelname->find('type',array=('conditions' => array('somefiled !=' => $value,'somemorefield <>' => $value)));<br> <br>

...