Список форумов Cake-PHP.ru Cake-PHP.ru
Форум программистов CakePHP
(на сайт)
 
 Watched TopicsWatched Topics   FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Рекурсивное удаление данных. Странное поведение функции!!

 
Начать новую тему   Ответить на тему    Список форумов Cake-PHP.ru -> Общий
Предыдущая тема :: Следующая тема  
Автор Сообщение
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, но кроме первой записи ничего не удаляетSad
Может ли быть причина в неправильном описание схемы базы данных в моделях?
Код:

$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    Заголовок сообщения: Ответить с цитатой

пробовали использовать встроеные функции Пирожка, что я вам указал?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Имя
Сообщение

Смайлики
Very Happy Smile Sad Surprised
Shocked Confused Cool Laughing
Mad Razz Embarassed Crying or Very sad
Evil or Very Mad Twisted Evil Rolling Eyes Wink
Exclamation Question Idea Arrow
Дополнительные смайлики

 
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Cake-PHP.ru -> Общий Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы можете начинать темы
Вы можете отвечать на сообщения
Вы можете редактировать свои сообщения
Вы можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2005 phpBB Group
Русская поддержка phpBB

Рейтинг@Mail.ru