in packages/better-auth/src/adapters/drizzle-adapter/drizzle-adapter.ts [136:224]
function convertWhereClause(where: Where[], model: string) {
const schemaModel = getSchema(model);
if (!where) return [];
if (where.length === 1) {
const w = where[0];
if (!w) {
return [];
}
const field = getFieldName({ model, field: w.field });
if (!schemaModel[field]) {
throw new BetterAuthError(
`The field "${w.field}" does not exist in the schema for the model "${model}". Please update your schema.`,
);
}
if (w.operator === "in") {
if (!Array.isArray(w.value)) {
throw new BetterAuthError(
`The value for the field "${w.field}" must be an array when using the "in" operator.`,
);
}
return [inArray(schemaModel[field], w.value)];
}
if (w.operator === "contains") {
return [like(schemaModel[field], `%${w.value}%`)];
}
if (w.operator === "starts_with") {
return [like(schemaModel[field], `${w.value}%`)];
}
if (w.operator === "ends_with") {
return [like(schemaModel[field], `%${w.value}`)];
}
if (w.operator === "lt") {
return [lt(schemaModel[field], w.value)];
}
if (w.operator === "lte") {
return [lte(schemaModel[field], w.value)];
}
if (w.operator === "ne") {
return [ne(schemaModel[field], w.value)];
}
if (w.operator === "gt") {
return [gt(schemaModel[field], w.value)];
}
if (w.operator === "gte") {
return [gte(schemaModel[field], w.value)];
}
return [eq(schemaModel[field], w.value)];
}
const andGroup = where.filter(
(w) => w.connector === "AND" || !w.connector,
);
const orGroup = where.filter((w) => w.connector === "OR");
const andClause = and(
...andGroup.map((w) => {
const field = getFieldName({ model, field: w.field });
if (w.operator === "in") {
if (!Array.isArray(w.value)) {
throw new BetterAuthError(
`The value for the field "${w.field}" must be an array when using the "in" operator.`,
);
}
return inArray(schemaModel[field], w.value);
}
return eq(schemaModel[field], w.value);
}),
);
const orClause = or(
...orGroup.map((w) => {
const field = getFieldName({ model, field: w.field });
return eq(schemaModel[field], w.value);
}),
);
const clause: SQL<unknown>[] = [];
if (andGroup.length) clause.push(andClause!);
if (orGroup.length) clause.push(orClause!);
return clause;
}