postgresql SQL中按路径获取类别记录

yk9xbfzb  于 11个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(133)

我有一个这样的postgres schema:

CREATE TABLE categories 
(
    category_id uuid NOT NULL PRIMARY KEY DEFAULT uuid_generate_v4(),
    parent_id uuid REFERENCES categories(category_id) ON DELETE CASCADE,
    image_url text,
    name text NOT NULL,
    description text NOT NULL,
    created_at timestamptz NOT NULL DEFAULT now(),
    updated_at timestamptz NOT NULL DEFAULT now(),
    UNIQUE (parent_id, name)
);

字符串
这同样可以是任何SQL语言。
关于如何从路径中获取categories记录的普遍共识是什么?这似乎是人们一直使用的东西,但我找不到关于这方面的资源。
比如说来自URL的motorcyles/wheels/tires.我需要从该信息中获取类别.
我在考虑写一个疯狂的SQL函数,从路径返回category_id,但这似乎很复杂。
谢谢你,
J

hgncfbus

hgncfbus1#

看起来甚至wordpress也只是在php中这样做,所以我想写一个sql函数会更有效。
最后我决定这样做:

CREATE OR REPLACE FUNCTION get_category_by_path(category_path text)
RETURNS categories AS $$
DECLARE
    path_elements text[];
    current_parent_id uuid := NULL;
    current_record categories;
BEGIN

    path_elements := string_to_array(category_path, '/');

    FOR i IN 1..array_length(path_elements, 1) LOOP

        -- Grab each category from parent to child
        SELECT * INTO current_record
        FROM categories
        WHERE slug = path_elements[i]
        AND (
          parent_id = current_parent_id
          OR (i = 1 AND parent_id IS NULL)
        );

        IF NOT FOUND THEN
            RAISE EXCEPTION 'No category found for path: %', category_path;
        END IF;

        current_parent_id := current_record.category_id;
    END LOOP;

    RETURN current_record;
END;
$$ LANGUAGE plpgsql;

字符串

相关问题