$tree = [];
$stack = [];
while ($item = $dbAllSections->fetch()) {
while (!empty($stack) && $stack[count($stack) - 1]['DEPTH_LEVEL'] >= $item['DEPTH_LEVEL']) {
array_pop($stack);
}
$index=end($stack)['INDEX'];
$tree[$index]['CHILDREN'][] = [
'ID' => $item['ID'],
'NAME' => $item['NAME']
];
$stack[] = [
'INDEX' => count($tree[$index]) - 1,
'DEPTH_LEVEL' => $item['DEPTH_LEVEL'],
];
}
/* нет нужды в onMounted->await
onMounted(async () => {
await sendData();
});
*/
sendData(); // заполнит реактивный массив
search_vector tsvector GENERATED ALWAYS AS
а то что у меня в полях name, description тип поля указан как jsonB
insert into "vacancy_fts" ("vacancy_id", "vector") select v.id,
setweight(to_tsvector('russian_ispell',v.name), 'A') ||
SELECT s.user_id FROM subscription_fts as u
LEFT JOIN vacancy_fts as v ON s.vector = v.vector
WHERE v.id = :id
-- при создании вакансии нужно заполнить индекс
insert into "vacancy_fts" ("vacancy_id", "vector") select v.id,
setweight(to_tsvector('russian_ispell',v.name), 'A') ||
setweight(to_tsvector('russian_ispell',coalesce(v.description,'')), 'B') ||
setweight(to_tsvector('russian_ispell',coalesce(k.tags,'')), 'D') -- pseudo
from "vacancies" as "v" left join "keywords" as k -- on ...
where v.id=:id
DB::table('vacancy_fts')
->whereFullText('vector', 'web developer')
->get();
key_words: ключевые слова из формы
при создании вакансии: description
$node = &$tree;
для каждого итема ссылка на всё дерево.$node = &$node[$ancestor['INDEX']]['CHILDREN'];
ссылка на нужный массив из дерева.$node[] = [
добавление в дерево'INDEX' => count($node) - 1,
добавление в стэк. только count($node[$ancestor['INDEX']]['CHILDREN'])-1Такой оригинальный способ рекурсии.