---
url: /data-modeling/collections.md
---
# Collections

Collections (sometimes also referenced as "globals" or "sections") are containers that hold groups of related blocks. They are a great way to organize and manage global content without building a custom module.

## Creating a collection

1. (optional) Create a new blueprint for your collection. (See [Creating a custom blueprint](/data-modeling/blueprints.md#creating-a-custom-blueprint) for more information on how to create a blueprint.).

   ::: tip
   Be sure to mark the blueprint as `hidden` if you don't want it to be selectable as a top-level block outside of the collection.
   :::

2. Create a new collection in the control panel and select the blueprint as the type. Give the collection a human-readable label and a unique handle to reference it in your templates.

3. Start adding entries to your collection :)

## Accessing collections in your templates

You can access the items of a collection in your templates (or anywhere else) by using the `collection` helper.

-> Read more about [Queriying collections](/frontend/collection-queries.md) in the frontend documentation.

## Routeable collection blocks

Collection blocks can be made routeable by enabling the `routeable` option in the `collection` blueprint method. This will automatically create routes for each entry in the collection.

```php{4}
Blueprint::make('custom.products')
    ->label('Produkte')
    ->collection(
        routeable: true,
    )
```

### Frontend template

When visiting the URL of a routeable block, our controller will try to render a blade template that matches following naming convention: `collections.{handle}`.

::: info Example
If you have a collection with the handle `products`, you should create a blade template at `theme/views/collections/products.blade.php`.
:::

You can access the block using the `$block` variable in your template just like you would with a regular block.

-> Read more about [Accessing field data](/frontend/blocks#accessing-field-data) in the frontend documentation.

## Custom ordering

You can define a custom base query for your collection by passing a closure to the `baseQuery` parameter. This is useful if you want to apply a specific order in the control panel.

```php{5}
Blueprint::make('custom.products')
    ->label('Produkte')
    ->collection(
        routeable: true,
        baseQuery: fn (Builder $query) => $query->reorder()->latest(),
    )
```

::: warning Custom ordering
When defining a custom base query, make sure to always call `reorder()` before applying any other ordering methods. This ensures that the default "order by position" is removed. (Collections with a custom base query can't be reordered in the control panel.)
:::

-> Read more about [Blueprints](/data-modeling/blueprints) in the data modeling documentation.

## Relationships between collections

You can define relationships between collections by using the `relationship` method on a select, multi-select, radio group or checkbox group field.

Here's an example of a select field on a `Product` blueprint that is related to a `Product Categories` collection:

```php
Field::select('category', 'Kategorie')->relationship('product_categories')
```

-> Read more about [relationships](/data-modeling/blueprints#relationships) in the Blueprint documentation.
