1

次のような 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に移動できます)。

しかし現在、要件には次のように記載されています。

  1. Food/Meat ブランチは常に存在します
  2. ユーザーがコンテンツを編集できるようになったため、Food/Meat サブツリーを保持する必要があります
  3. ツリーの他の部分を更新する必要があります (この場合は食品/果物ですが、アプリは構造に依存しません)。

したがって、これを実行できないDROP TABLE場合、ブランチ (食品/肉) を取得し、ツリーの後に挿入する必要があり、DROP TABLE実行CREATE TABLEINSERT TABLEれます。

問題は、シェルからブランチを取得する方法です。もう一度挿入する方法は?(シェルスクリプトから実行できない場合は、2 つの小さな PHP スクリプトを作成できますが、ブランチを取得して再度挿入する方法がわかりません。任意のアイデアを歓迎します)

4

0 に答える 0