Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
nr7
цитировать
Зарегистрирован: 25 Мар 2008 14:21:15 Сообщения: 9
|
Добавлено: 07 Май 2008 14:36:26 Заголовок сообщения: Рекурсивное удаление данных. Странное поведение функции!! |
|
|
Привет, ребята! Если есть минутка, помогите, пожалуйста, решить проблему. Уже 3 часа над ней бьюсь, не могу понять причину не работы. Ситуация следующая: есть функция delete_product_property, она рекурсивно удаляет записи в таблице. Когда я вызываю её из другой функции, рекурсия проходит хорошо по всем записям, но вызов $this->PropertyTree->deleteAll() приводит к удалению только первой записи, все остальные не удаляются. Когда же вызов фукнции идет с адресной строки, удаление срабатывает корректно! В чем я ошибаюсь или это глюк???
function delete_product_property($property_id){
$this->PropertyTree->deleteAll('PropertyTree.property_id='.$property_id);
$children = $this->PropertyTree->findAll('PropertyTree.parent_id='.$property_id);
foreach($children as $key=>$value)
if(isset($value['PropertyTree']['property_id'])) $this->delete_product_property($value['PropertyTree']['property_id']);
} |
|
Вернуться к началу |
|
|
AriaL Гость цитировать
|
Добавлено: 07 Май 2008 16:55:07 Заголовок сообщения: |
|
|
Хмм... могу предложить немного другой вариант рекурсии на примере иерархии меню (menu_id - поле, хранящее ID предка)
Код: |
/**
* Выстраивает рекурсивную последовательность из всех потомков для заданного ID.
* @param $curr_id - текущий ID
* @param array $ids - массив ID, в который будут добавляться ID потомков
*/
function recurse($curr_id,&$ids){
// получаем всех потомков для текущего элемента
$this->Menu->recursive = 0;
$_childs = $this->Menu->findAll("menu_id=".$curr_id,"id");
$childs = array();
// преобразуем перечень потомков в обычный список
foreach ($_childs as $_child) {
array_push($childs,$_child["Menu"]["id"]);
}
// для каждого из потомков выполним ту же операцию...
if($childs != null){
foreach ($childs as $child) {
$this->recurse($child,$ids);
}
}
// а если мы попали сюда, значит потомков нет, это меню нижнего уровня и его можно добавлять
// в список на удаление. Ну а дальше - рекурсивный возврат
array_push($ids,$curr_id);
} |
Использование в удалении:
Код: |
$ids = array();
$this->recurse($id,$ids);
foreach ($ids as $id) {
$this->Menu->del($id);
} |
|
|
Вернуться к началу |
|
|
DeeperMD
цитировать
Зарегистрирован: 08 Фев 2008 15:04:11 Сообщения: 144 Откуда: $Молдова->Кишинёв->Буюканы()
|
Добавлено: 07 Май 2008 17:30:05 Заголовок сообщения: |
|
|
Да.. лучьше используйте ассоциативную модель Пирожка, там уже это встроенно до 3-х вложений |
|
Вернуться к началу |
|
|
Гость
цитировать
|
Добавлено: 07 Май 2008 17:37:40 Заголовок сообщения: |
|
|
To AriaL:
спасибо, попробывал твой вариант. Но, к сожалению, не заработало! На вход поступает массив с группой ids, но кроме первой записи ничего не удаляет
Может ли быть причина в неправильном описание схемы базы данных в моделях?
Код: |
$ids =
Array
(
[0] => 2
[1] => 3
[2] => 1
)
foreach ($ids as $id) {
$this->PropertyTree->del($id);
}
|
|
|
Вернуться к началу |
|
|
Гость
цитировать
|
Добавлено: 07 Май 2008 17:40:30 Заголовок сообщения: |
|
|
DeeperMD писал(а): | Да.. лучьше используйте ассоциативную модель Пирожка, там уже это встроенно до 3-х вложений |
Уточните, пожалуйста, что подразумевается под "ассоциативная модель Пирожка"? можно поподробнее. спасибо! |
|
Вернуться к началу |
|
|
DeeperMD
цитировать
Зарегистрирован: 08 Фев 2008 15:04:11 Сообщения: 144 Откуда: $Молдова->Кишинёв->Буюканы()
|
Добавлено: 07 Май 2008 18:03:39 Заголовок сообщения: |
|
|
Цитата: | del
* string $id
* boolean $cascade
Удаляет модель, выбранную по $id.
Если эта модель ассоциирована с другими моделями, и ключ зависимости был установлен в ассоциативном массиве, этот метод также удалил те ассоциативные модели, если $cascade присвоено значение true.
Возвращает true при успешном выполнении. |
|
|
Вернуться к началу |
|
|
nr7
цитировать
Зарегистрирован: 25 Мар 2008 14:21:15 Сообщения: 9
|
Добавлено: 08 Май 2008 09:55:59 Заголовок сообщения: |
|
|
проверил запросы к базе данных, самое интересное что удаляется только одна запись с id = 1, хотя в очереди она 3-я на удаление..короче запутался окончательно. У вас есть какие-то мысли по этому поводу?
Код: |
DELETE `PropertyTree` FROM `properties_tree` AS `PropertyTree` LEFT JOIN `properties_names` AS `PropertyName` ON (`PropertyName`.`property_id` = `PropertyTree`.`property_id`) LEFT JOIN `properties_to_categories` AS `PropertyToCategory` ON (`PropertyToCategory`.`property_id` = `PropertyTree`.`property_id`) WHERE `PropertyTree`.`property_id` IN (2)
SELECT COUNT(*) AS `count` FROM `properties_tree` AS `PropertyTree` WHERE `PropertyTree`.`property_id` = 3
DELETE `PropertyTree` FROM `properties_tree` AS `PropertyTree` LEFT JOIN `properties_names` AS `PropertyName` ON (`PropertyName`.`property_id` = `PropertyTree`.`property_id`) LEFT JOIN `properties_to_categories` AS `PropertyToCategory` ON (`PropertyToCategory`.`property_id` = `PropertyTree`.`property_id`) WHERE `PropertyTree`.`property_id` IN (3)
SELECT COUNT(*) AS `count` FROM `properties_tree` AS `PropertyTree` WHERE `PropertyTree`.`property_id` = 1
DELETE `PropertyTree` FROM `properties_tree` AS `PropertyTree` LEFT JOIN `properties_names` AS `PropertyName` ON (`PropertyName`.`property_id` = `PropertyTree`.`property_id`) LEFT JOIN `properties_to_categories` AS `PropertyToCategory` ON (`PropertyToCategory`.`property_id` = `PropertyTree`.`property_id`) WHERE `PropertyTree`.`property_id` IN (1)
|
|
|
Вернуться к началу |
|
|
DeeperMD
цитировать
Зарегистрирован: 08 Фев 2008 15:04:11 Сообщения: 144 Откуда: $Молдова->Кишинёв->Буюканы()
|
Добавлено: 08 Май 2008 13:02:21 Заголовок сообщения: |
|
|
пробовали использовать встроеные функции Пирожка, что я вам указал? |
|
Вернуться к началу |
|
|
|