Collection
Adds a collection of model records to the page.
The collection
component displays a collection of entries on the page. The collection component can be used on any page, layout or partial.
# Available Properties
The following properties are supported by the component.
Property | Description |
---|---|
handle | The handle of the entry blueprint. |
recordsPerPage | Number of records to display on a single page. Leave empty to disable pagination. |
pageNumber | This value is used to determine what page the user is on. |
sortColumn | Column name the records should be ordered by. |
sortDirection | Direction the records should be ordered by. Supported values are asc and desc . |
# Basic Usage
The following adds a collection of Blog\Post entries to the page. The collection is accessed in Twig by looping the default collection
variable.
[collection]
handle = "Blog\Post"
{% for post in collection %}
<h1>{{ post.title }}</h1>
{% endfor %}
When multiple collections are used on the same page, the component can be assigned a name posts using the component alias and this is the variable name that becomes available to the page. The following collection is accessed using the posts
variable instead.
[collection posts]
handle = "Blog\Post"
{% for post in posts %}
<h1>{{ post.title }}</h1>
{% endfor %}
Use the is empty
or is not empty
expression to check if a collection has at least one record available to display.
{% if posts is not empty %}
{# ... #}
{% endif %}
# Performing Queries
When accessing the component variable using a method it will switch to a database model query. For example, to only show entries that have a field color
with the value blue use the where
query method. Using the {% set %}
Twig tag will assign the result to a new variable.
{% set bluePosts = posts.where('color', 'blue').get() %}
To show only posts that have a related author, you can use the whereRelation
query method. To complete the query, proceed with the get()
method. The following lists posts that are assigned to the author
with a slug set to bella-vista.
{% set authorPosts = posts.whereRelation('author', 'slug', 'bella-vista').get() %}
# Accessing the Entry Type
To filter records by their entry type, perform a where()
query using the content_group
attribute. The following will list posts that use the entry type code featured_post.
{% set featuredPosts = posts.where('content_group', 'featured_post').get() %}
# Paginating Records
You could also apply pagination to the collection with the paginate()
method instead. The following will paginate the posts at 10 per page and displays the paginated navigation.
{% set authorPosts = posts.whereRelation(...).paginate(10) %}
{{ pager(authorPosts) }}
See the Pagination feature to learn more about paging records.
# Searching Records
To search records, use the searchWhere()
method to perform a search query on a column's value. The following will search for records the supplied term and columns using a case insensitive query.
{% set foundPages = pages.searchWhere(searchTerm, ['title', 'content']).get() %}
You may also use the searchWhereRelation()
method to search related records, where the relation name is included in the method for querying the relationship existence.
{% set foundPages = pages.searchWhereRelation(searchTerm, 'author', ['title']).get() %}
# Eager Loading Related Records
In some cases, and for performance reasons, you may wish to eager load related records. Use the load
method on the collection, passing the relation name. In the next example, the categories
relation will be loaded with every post in the collection.
{% do authorPosts.load('categories') %}
# Counting Records
Let's assume you want to display a list of blog categories and count the number of posts in each category. First, define the inverse relation on the category blueprint as posts.
posts:
type: entries
source: Blog\Post
inverse: categories
hidden: true
Then, call the withCount
function on the collection component, followed by get
to return a collection of category records. This will create an attribute on each category called post_count.
{% set categories = collection.withCount('posts').get() %}
{% for category in categories %}
<h5>{{ category.title }} ({{ category.post_count }} posts)</h5>
{% endfor %}