Sometimes, you may need to populate related data in hooks before saving or fetching a document.
Example: Before Change Hook
import { Payload } from 'payload';
const populateProfile = async ({ req, data }) => {
const profile = await req.payload.findByID({
collection: 'profiles',
id: data.profile,
});
return { ...data, profileData: profile };
};
Using Access Control with Relations
Payload CMS allows you to restrict access to related fields using access control functions.
access: ({ req }) => {
return req.user.role === 'admin';
}
This ensures only admins can access certain related fields.
Using Local API for Relational Queries
In addition to REST and GraphQL, Payload provides a Local API to work with relational data efficiently.
Example: Fetching a User’s Profile Locally
const userWithProfile = await payload.find({
collection: 'users',
where: { id: { equals: userId } },
depth: 2,
});
This ensures that relational data is fully populated within the application without requiring an external API call.
Creating Bidirectional Relations
In some cases, you may want a bidirectional relationship where both collections reference each other.
Example: Linking Users and Organizations
const Organizations: CollectionConfig = {
slug: 'organizations',
fields: [
{
name: 'members',
type: 'relationship',
relationTo: 'users',
hasMany: true,
},
],
};
This allows an organization to reference multiple users as members.