私はビジネス ディレクトリのようなものに取り組んでおり、カテゴリ リストでカテゴリの再帰的な親を表示する必要があります。
そのために次の関数を使用しています:
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;
}
私はこの機能を使用しており、管理サイトにあるため、管理サイトで少し遅くても問題ありません。管理者は1人だけなので、より多くのメモリを割り当てることができます.しかし、1回の呼び出しで300M以上のメモリを制限すると思います.多すぎて、まだこれを取得しています:
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 ;