В CakePHP 3, предположит, что я хочу, чтобы удалить все отделов, которые имеют некоторые сотрудников назвали «Джон» (отделов имеют много сотрудников, сотрудники принадлежат отделу)CakePHP 3 удаления фильтрации ассоциированных данные
Самый простой подход фильтровать все эти отделы, а также удалять их по одному в цикле Еогеасп:
$departments = $this->Departments->find()
->matching('Employees', function ($q) {
return $q->where(['Employees.name' => 'John']);
})
->all();
foreach ($departments as $department) {
$this->Departments->delete($department);
}
Это приведет к одному SELECT, запрос, плюс один запрос на удаление для каждой записи. Я бы предпочел, чтобы только один запрос отправлялся и выполнялся базой данных. Что-то вроде этого:
DELETE Departments
FROM departments Departments
INNER JOIN employees Employees ON
Employees.department_id = Departments.id
AND Employees.name = 'John';
Читая документы, которые я нахожу три способа удаления записей:
- Using the Table object one by one, получить объект, а затем удалить его.
- Using the Table with deleteAll, который принимает множество условий над целевой таблицей, а не связанные с ними.
- Using the ORM, еще раз с множеством условий.
Есть ли элегантный способ получить мой запрос с помощью CakePHP 3 и ORM?
Спасибо @arilia. Собственно, чтобы получить этот запрос, вы должны изменить '' id '=> $ department' '' id IN' => $ department', в противном случае вы получите равное условие «=». С другой стороны, этот запрос возвращает ошибку [1093 mysql] (http://stackoverflow.com/questions/45494/mysql-error-1093-cant-specify-target-table-for-update-in-from- пункт). – pperejon
В любом случае полученный SQL-запрос по-прежнему не соответствует требованиям [docs] (http://dev.mysql.com/doc/refman/5.6/en/update.html), где они говорят: «Вы не можете обновить таблицу и выбрать из та же таблица в подзапросе. – pperejon
Я не знал об этом. Я отредактировал или удалил свой ответ – arilia