| Предыдущая тема :: Следующая тема | 
	
	
		| Автор | Сообщение | 
	
		| 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    Заголовок сообщения: |   |  
				| 
 |  
				| пробовали использовать встроеные функции Пирожка, что я вам указал? |  | 
	
		| Вернуться к началу |  | 
	
		|  | 
	
	
	
	
		|  |