А функция как работает?)
parent_type != $parent->type or parent_type == $parent->type
Это не абсурд?) Или я не понимаю?)
Есть смежная таблица, она хранит тип и айди.
У каждого типа есть своя таблица и тот айди, как раз таки из таблица типа.
При создании записи все окей. Потому что $parent = null;
Но при обновлении записи, есть проблемка, нужно проверить есть ли в смежной таблице запись с child_id = $id, child_type = $type.
Так вот, если есть уже две записи в смежной таблице с parent_type=teacher (допустим)
И ты решил у второй записи добавить новый child (такой же как и у первой записи), то как раз таки он через where (parent_type, <>, teacher) не пройдет уже и запись успешно добавится, что не есть правильно