I have the following table structure, which is also for sqlfiddle for convenience:
+ --------- + ----------- + --------- + ---------- + ------ ----- + ------------------- + ------------------------ ----------- + -------- + -------------- + ------------- + --------------- + ----------- +
| rule_id | parent_id | left_id | right_id | rule_type | rule_title | rule_description | public | parse_bbcode | parse_links | parse_smilies | group_ids |
+ --------- + ----------- + --------- + ---------- + ------ ----- + ------------------- + ------------------------ ----------- + -------- + -------------- + ------------- + --------------- + ----------- +
| 1 | 0 | 1 | 6 | cat | Sample Category 1 | | 1 | 0 | 0 | 0 | 1 2 7 |
| 2 | 1 | 2 | 3 | rule | Sample Rule 1 | This is a sample rule description | 1 | 1 | 1 | 1 | 1 2 7 |
| 3 | 0 | 7 | 8 | cat | Sample category 2 | | 1 | 0 | 0 | 0 | 1 7 2 |
| 4 | 0 | 9 | 10 | cat | Sample category 3 | | 1 | 0 | 0 | 0 | 1 7 2 |
| 5 | 1 | 4 | 5 | rule | Sample rule 3 | lol | 1 | 1 | 1 | 1 | 1 2 7 |
+ --------- + ----------- + --------- + ---------- + ------ ----- + ------------------- + ------------------------ ----------- + -------- + -------------- + ------------- + --------------- + ----------- +
As you can see, rule_type can be either 'cat' or 'rule' .
cat denotes a category , and categories are the root nodes: therefore parent_id always 0 . In my code, we can identify categories by checking either if rule_type = 'cat' or parent_id = 0 .
You can also see that I am using nested sets for my project, and that is the problem.
I have successfully created functions that:
BUT I cannot set the RULES right_id and left_id if we change its parent_id ! I also cannot set right_id and left_id if we remove the rule OR categories.
Example
I will try to explain with an example. Please note that this is just an example, not an actual case, and I need a general answer.
From the table above, we see that we have 3 categories with rule_id IN (1, 3, 4) and two rules with rule_id IN (2, 5) .
The rule with rule_id = 2 is part of the category with rule_id = 1 , this can be seen from the parent_id column. What if I change parent_id to 4? How would I set right_id and left_id so that everything is in place again? I know that we need to update as rule_id IN (1, 4) in order to reorder, but I don’t know what my query will look like.
The same thing happens for deletion ... For example, I delete rule_id = 2 (this is a rule ), how would I set right_id and left_id for parent_id = 1 in the correct order? Or when I delete a category? How to reorder categories?
I really didn’t do anything here because I don’t have any vision of how I would do this, so I ask for help guys.
I hope I get it. If not, let me know and I will try to be more visual.