次のような MPTT (変更された事前注文ツリーのトラバーサル) があります。
( SitePointから取得)
私の実際のツリーには数千のノードとより複雑な構造がありますが、これは単純化して問題を示しています。
この瞬間まで、このツリーを変更する必要があるたびに、次のようなシェル スクリプトを使用していました。
#!/bin/bash
mysql -umyuser -pmypass database < tree.sql
これを実行します(tree.sql):
DROP TABLE IF EXISTS `tree`;
CREATE TABLE `tree` (
`parent` varchar(32) DEFAULT NULL,
`title` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`lft` int(11) NOT NULL,
`rgt` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
LOCK TABLES `tree` WRITE;
INSERT INTO `tree` VALUES (....),(....)....
(注:複数のサーバーに同じPHPアプリケーションの複数のインストールがあり、これはそれらすべてを更新する簡単/迅速な方法であるため、シェルスクリプトを使用してこれを行いますが、必要に応じて更新をPHPに移動できます)。
しかし現在、要件には次のように記載されています。
- Food/Meat ブランチは常に存在します
- ユーザーがコンテンツを編集できるようになったため、Food/Meat サブツリーを保持する必要があります
- ツリーの他の部分を更新する必要があります (この場合は食品/果物ですが、アプリは構造に依存しません)。
したがって、これを実行できないDROP TABLE
場合、ブランチ (食品/肉) を取得し、ツリーの後に挿入する必要があり、DROP TABLE
実行CREATE TABLE
さINSERT TABLE
れます。
問題は、シェルからブランチを取得する方法です。もう一度挿入する方法は?(シェルスクリプトから実行できない場合は、2 つの小さな PHP スクリプトを作成できますが、ブランチを取得して再度挿入する方法がわかりません。任意のアイデアを歓迎します)