Generar

Vela proporciona un generador para crear modelos de base de datos, formularios, recursos, esquemas y andamiajes CRUD completos. Cada uno de estos comparte una sintaxis común. Dentro de la sintaxis, las formas singulares y plurales tienen significado.

Sintaxis

$ vela generate <type> <name> [fields...]

Nombre

El nombre plural del modelo, formulario, recurso, esquema o andamiaje, por ejemplo pets o todos. Los nombres de los modelos son siempre plurales y se convertirán a plural si se proporciona la forma singular. Los nombres pueden anidarse dentro de directorios usando un separador de barra (/). Por ejemplo, users/pets creará un recurso en /users/pets.

Campos

Los campos se definen como pares name:type, por ejemplo name:string o age:number. Si el modelo ya existe en la base de datos, la opción fields se puede omitir y el generador utilizará los campos existentes.

Tipos de campo

Vela admite los siguientes tipos de campo:

text
number
bool
date
email
password
url
editor
autodate
select
file/files
json
geoPoint
relation

autodate

El tipo de campo autodate es un tipo de campo especial que establece automáticamente el campo en la fecha y hora actuales en la creación o actualización. Los nombres de campo para autodate pueden ser: created/created_at o updated/updated_at.

select

El campo select tiene una sintaxis especial para definir las opciones. Las opciones se definen como pares value:label. La forma singular o plural del nombre del campo determina si el select actúa como selección única o múltiple.

model pets type:select(dog:Dog,cat:Cat,bird:Bird)
model products colors:select(red:Red,green:Green,blue:Blue)

file

El campo de archivo se utiliza para cargar archivos al servidor. La forma singular o plural del nombre del campo determina si el campo acepta un solo archivo o un array de archivos.

model owners avatar:file
model pets photos:files

Campos requeridos

Los campos se marcan como obligatorios añadiendo ! al nombre del campo. Esto marca el campo como obligatorio en la base de datos y en el esquema Zod para la validación del formulario.

model pets name:string! age:number!

Relaciones

Además de los tipos de campo anteriores, Vela admite pasar el nombre de cualquier modelo existente para crear una relación. El singular frente al plural tiene importancia aquí, ya que determina si la relación es de uno a muchos o de muchos a muchos.

model pets name:string owner:user
model teams name:string members:users

De forma similar a Ruby on Rails, la abreviatura references puede utilizarse para crear relaciones basadas en el nombre del campo.

model posts title:string author:user tags:references

Propiedad y permisos

Si la autenticación está habilitada con el comando vela enable auth, es posible asociar modelos con el usuario autenticado. Esto se puede hacer directamente en el modelo con el tipo de campo especial current_user, que establecerá automáticamente el campo en el usuario autenticado en la creación (y excluirá el campo del formulario frontend).

model posts title:string author:current_user

Si el modelo está anidado dentro de otro modelo, vela recorre la jerarquía del modelo para encontrar el modelo padre más cercano con una relación con el usuario autenticado.

model teams name:string
model users email:string team:references
model projects title:text team:references

En este ejemplo, el modelo users está asociado con el modelo teams. El acceso al modelo projects está restringido a los usuarios que son miembros del equipo del proyecto.

Uso

En el proyecto SvelteKit generado, hay dos formas de recuperar datos de la base de datos. La primera es la API de administración locals.admin equivalente a consultar la base de datos directamente. La segunda es la API de ámbito de usuario locals.pb que proporciona acceso a la base de datos con ámbito para el usuario autenticado.

API de administración

export const load = async ({ locals }) => {
    const posts = await locals.admin.collection('posts').getFullList();
    return { posts };
}

API de ámbito de usuario

export const load = async ({ locals }) => {
    const posts = await locals.pb.collection('posts').getFullList();
    return { posts };
}

Limitaciones

La propiedad a través de la retroreferencia no es compatible.