Как реализовать фильтрацию в Prisma

Ответ

Для фильтрации в Prisma используйте параметр where в запросах. Он позволяет задавать условия для выборки данных. Можно фильтровать по полям, отношениям и комбинировать условия.

Пример простой фильтрации:

// Фильтрация по одному полю
const users = await prisma.user.findMany({
  where: {
    age: { gt: 18 }
  }
});

// Комбинированная фильтрация
const posts = await prisma.post.findMany({
  where: {
    AND: [
      { title: { contains: 'Prisma' } },
      { published: true }
    ]
  }
});

Доступные операторы:

  • equals, not
  • in, notIn
  • lt, lte, gt, gte
  • contains, startsWith, endsWith
  • AND, OR, NOT

Для отношений используйте вложенные where:

const usersWithPosts = await prisma.user.findMany({
  where: {
    posts: {
      some: {
        likes: { gt: 100 }
      }
    }
  }
});

Ответ 18+ 🔞

А, ну вот, опять про эту вашу фильтрацию в Prisma спрашивают. Ну что ж, слушай сюда, я тебе сейчас так объясню, что ты сам себе охуеешь от простоты, блядь.

Так, значит, есть у тебя эта штука — where. Это типа такой волшебный пендель, которым ты говоришь базе: «Эй, сука, дай мне только то, что мне надо, а не всю хуйню подряд!». Всё, что ты хочешь отфильтровать — пихаешь туда.

Вот смотри, самый простой пример, чтобы мозг не ебал:

// Найди мне всех пользователей, которым уже можно пиво покупать, а не молоко
const users = await prisma.user.findMany({
  where: {
    age: { gt: 18 } // gt — это «больше чем». То есть, старше 18, ёпта.
  }
});

Видишь? Всё просто, как три копейки. Хочешь найти посты, где в заголовке есть «Prisma» и они опубликованы? Да хуй с ним, сделаем:

const posts = await prisma.post.findMany({
  where: {
    AND: [ // AND — это «и то, И ЭТО». Оба условия должны быть true, иначе нахуй не надо.
      { title: { contains: 'Prisma' } }, // contains — ищет кусок текста внутри, типа «содержит»
      { published: true } // ну и чтоб опубликован был, а не черновик какой-нибудь
    ]
  }
});

А операторов там, блядь, овердохуища! Запомни главные, а то опять будешь как мартышлюшка в документации копаться:

  • equals, not — равно и НЕ равно. Очевидно же, в рот меня чих-пых.
  • in, notIn — входит в список или, наоборот, выходит из него. «Дай мне пользователей с id 1, 2 или 5, а остальные пусть идут на хуй».
  • lt, lte, gt, gte — меньше, меньше или равно, больше, больше или равно. Для цифр и дат.
  • contains, startsWith, endsWith — для текста. Содержит, начинается с, заканчивается на. Пиздец как полезно.
  • AND, OR, NOT — чтобы условия комбинировать. Собрал кучу проверок в AND — все должны сработать. В OR — хоть одна. NOT — всё, кроме этого.

А теперь, внимание, ебушки-воробушки, самое вкусное — фильтрация по связям! Допустим, тебе нужны не просто пользователи, а только те, у кого есть посты с больше чем сотней лайков. Чувствуешь подвох? Подозрение ебать чувствую, что многие тут тупят.

const usersWithPosts = await prisma.user.findMany({
  where: {
    posts: { // Залезаем в связь 'posts', которая описана в схеме
      some: { // some — значит, «найди таких юзеров, у которых ХОТЯ БЫ ОДИН пост удовлетворяет условию ниже»
        likes: { gt: 100 }
      }
    }
  }
});

Вот и всё! Никакой магии. Говоришь: «Эй, Prisma, дай мне юзеров, но только таких, у которых в связанных постах (posts) есть (some) хотя бы один, где лайков больше сотни». Она тебе таких и найдёт. А если постов таких нет — ну, извини, дружок, иди нахуй с пустым массивом.

Короче, не усложняй. where — твой главный инструмент, чтобы не тащить из базы тонны ненужного говна. Используй с умом, и будет тебе счастье.