Я работаю над бизнес-справочником, и мне нужно показать рекурсивные родители категорий в списке категорий.
Для этого я использую следующую функцию:
public function get_recursive_parents($category_id){ $categories = array(); $res = $this->db->from('categories')->where('cat_id',$category_id)->get()->row_array(); $cat_id = $res['parent_id']; $categories[] = $res; while($cat_id){ $res = $this->db->from('categories')->where('cat_id',$cat_id)->get()->row_array(); $categories[] = $res; $cat_id = $res['parent_id']; } return $categories; }
Я использую эту функцию и, поскольку она находится на админ-сайте, и немного медленнее на сайте администратора, тоже отлично, и администратор будет только одним, поэтому я могу дать ему больше памяти. Но я думаю, что память с лимитом более 300 М для одного вызова слишком много и все еще получаю это:
Fatal error: Allowed memory size of 367001600 bytes exhausted (tried to allocate 72 bytes) in /var/www/usmanproject/salesfinder/system/database/DB_active_rec.php on line 2007
Так есть способ, чтобы я мог оптимизировать функцию выше? или мне нужно сделать некоторый определенный тип индексации или оптимизацию алгоритма или любой другой возможный способ? Или я просто прекращаю показывать всех родителей и суперпользователей категории (это требование клиента видеть иерархию)? Или нужно увеличить память, поскольку я уже работал в каталоге, и это тоже было медленным на сайте администратора, поэтому я предполагаю, что они просто использовали больше памяти?
Любые советы будут оценены.
Вот эта схема таблицы, у нее есть parent_id, поэтому она работает как рекурсивное отношение.
CREATE TABLE IF NOT EXISTS `categories` ( `cat_id` int(11) NOT NULL AUTO_INCREMENT, `cat_name` varchar(255) DEFAULT NULL, `cat_title` varchar(255) DEFAULT NULL, `cat_desc` varchar(255) DEFAULT NULL, `cat_text` text, `parent_id` int(11) NOT NULL, `cat_img` varchar(255) DEFAULT NULL, `sort_id` int(11) NOT NULL DEFAULT '1', `last_level` tinyint(4) NOT NULL, PRIMARY KEY (`cat_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=221 ;