Структура моей таблицы:
boxes (id, boxname)
boxes_items (id, box_id, item_id)
Я просматривал журналы SQL для действия "удалить ящик", и я немного испуган.
SELECT COUNT(*) AS count FROM boxes Box WHERE Box.id = 191
SELECT BoxesItem.id FROM boxes_items BoxesItem WHERE BoxesItem.box_id = 191
SELECT COUNT(*) AS count FROM boxes_items BoxesItem WHERE BoxesItem.id = 1685
DELETE FROM boxes_items WHERE boxes_items.id = 1685
SELECT COUNT(*) AS count FROM boxes_items BoxesItem WHERE BoxesItem.id = 1686
DELETE FROM boxes_items WHERE boxes_items.id = 1686
-- snip 50 more SELECT & DELETE statements --
SELECT COUNT(*) AS count FROM boxes_items BoxesItem WHERE BoxesItem.id = 1733
DELETE FROM boxes_items WHERE boxes_items.id = 1733
DELETE FROM boxes WHERE boxes.id = 191
Это, пожалуй, наименее эффективный способ удаления из этих таблиц, который я мог придумать. Я имею в виду, это можно заменить на это:
DELETE FROM boxes WHERE id = 191
DELETE FROM boxes_items WHERE box_id = 191
Есть ли причина, по которой Кейк так поступает? Если нет, знаете ли вы какой-нибудь способ, которым я могу упростить процедуру, не нарушая основные библиотеки?
Вот соответствующие биты кода:
// app/controllers/boxes_controller.php /////////////
public function delete($id = null) {
if ($this->Box->del($id)) {
$this->redirect(array('action'=>'index'));
}
}
// app/models/box.php ///////////////////////////////
class Boxes extends AppModel {
var $hasAndBelongsToMany = array(
'Item'
);
}
// app/models/app_model.php /////////////////////////
class AppModel {
var $actsAs = array('Containable');
var $recursive = -1;
}