CoachnestCoachnest
Sign InGet Started
Back to course

Mastering CRUD: Build Full-Stack Database Applications

…
—
Contents
1

What Is CRUD and Why It Matters

Reading12mFree
2

CRUD, REST, and HTTP Verbs

Reading14mFree
3

The Data Lifecycle of a Record

Reading11m
4

Course Project Tour: TaskFlow

Video9m
5

Chapter 1 — Quiz

Quiz8m
6

Tables, Rows, Columns & Types

Reading14m
7

Primary Keys & IDs (Auto-increment vs UUID)

Reading13m
8

Relationships: One-to-Many & Many-to-Many

Reading16m
9

Normalization & Schema Design Principles

Reading14m
10

Modeling TaskFlow with Prisma

Reading13m
11

Chapter 2 — Quiz

Quiz8m
12

INSERT — Creating Rows

Reading13m
13

SELECT — Reading & Filtering

Reading16m
14

UPDATE — Changing Rows Safely

Reading12m
15

DELETE — Removing Rows

Reading11m
16

Live SQL: A Full CRUD Session

Video15m
17

Chapter 3 — Quiz

Quiz9m
18

REST API Design for CRUD Resources

Reading14m
19

HTTP Status Codes That Tell the Truth

Reading12m
20

Scaffolding the API (Express & Next.js)

Reading16m
21

Connecting an ORM (Prisma) to Your Routes

Reading13m
22

Chapter 4 — Quiz

Quiz8m
23

Building the Create Endpoint End-to-End

Reading15m
24

Reading a Single Resource

Reading11m
25

Listing Collections

Reading13m
26

Live Coding: Create & Read

Video16m
27

Chapter 5 — Quiz

Quiz8m
28

PUT vs PATCH: Full vs Partial Updates

Reading13m
29

Authorization: Who Can Change This Row?

Reading12m
30

Soft Delete, Hard Delete & Restore

Reading14m
31

Idempotency & Concurrency Control

Reading13m
32

Chapter 6 — Quiz

Quiz9m
33

Input Validation with Zod

Reading14m
34

Mass Assignment & Over-Posting

Reading11m
35

SQL Injection & Safe Queries

Reading13m
36

Consistent Error Handling

Reading12m
37

Chapter 7 — Quiz

Quiz9m
38

Offset vs Cursor Pagination

Reading15m

Filtering & Dynamic WHERE Clauses

Reading13m
40

Safe Sorting & Full-Text Search

Reading14m
41

Indexing for Fast Reads

Reading13m
42

Chapter 8 — Quiz

Quiz9m
43

Forms & Creating Records from the UI

Reading14m
44

Fetching & Displaying Data

Reading13m
45

Optimistic Updates & Deletes

Reading14m
46

Building the TaskFlow UI

Video17m
47

Chapter 9 — Quiz

Quiz8m
48

Transactions & Data Integrity

Reading15m
49

Testing Your CRUD Endpoints

Reading14m
50

Caching, N+1 & Performance

Reading13m
51

Deploying & Migrating Safely

Reading14m
52

Chapter 10 — Final Quiz

Quiz10m
←→navigate lessons
Chapter 8 of 10·Chapter 8 — Pagination, Filtering, Sorting & Search
Lesson 39 of 52Reading13 min

Filtering & Dynamic WHERE Clauses

Filtering & Dynamic WHERE Clauses¶

Clients want "show me TODO tasks due this week tagged urgent." You build that where from query parameters — safely.

Parse Query Params with a Schema¶

ts
8 lines
1const Query = z.object({
2  status: z.enum(["TODO", "IN_PROGRESS", "DONE"]).optional(),
3  tag: z.string().optional(),
4  dueBefore: z.coerce.date().optional(),
5});
6const { status, tag, dueBefore } = Query.parse(
7  Object.fromEntries(req.nextUrl.searchParams),
8);

Validate filters just like a body — they're untrusted input too.

Build the WHERE Conditionally¶

ts
8 lines
1const where: Prisma.TaskWhereInput = {
2  ownerId: session.userId,             // always scope to the caller
3  ...(status && { status }),
4  ...(dueBefore && { dueDate: { lte: dueBefore } }),
5  ...(tag && { tags: { some: { name: tag } } }),
6};
7
8const tasks = await prisma.task.findMany({ where, take: 20 });

Each filter is added only when present. The base scope (ownerId) is never optional.

Combining Conditions: AND / OR¶

ts
7 lines
1where: {
2  ownerId,
3  OR: [
4    { title: { contains: q, mode: "insensitive" } },
5    { description: { contains: q, mode: "insensitive" } },
6  ],
7}

Filter on the Database, Not in App Code¶

ts
6 lines
1// ❌ fetch everything, filter in JS — slow, memory-heavy
2const all = await prisma.task.findMany();
3const todo = all.filter((t) => t.status === "TODO");
4
5// ✅ let the database do it
6const todo = await prisma.task.findMany({ where: { status: "TODO" } });

Push every filter, sort, and limit into the query. The database has indexes; your Array.filter does not.

Previous

Offset vs Cursor Pagination

Next

Safe Sorting & Full-Text Search

Use ← → arrow keys to navigate between lessons