Query Builder
Introduction
Query builders in the Streams Platform work just the same as query builders in Laravel with the addition of a few cool features.
Starting Queries
You can use repositories to start queries.
$repository = app(\Anomaly\PagesModule\Page\Contract\PageRepositoryInterface::class);
$pages = $repository->newQuery()->where('enabled', true)->get();
You can also use the model itself as you would in Laravel.
use \Anomaly\PagesModule\Page\PageModel;
$pages = (new PageModel)->where('enabled', true)->get();
Database Cache
The query builder provides a direct API for storing query results in the model's cache collection
. The cache collection is automatically cleared when the model's table is altered in any way (such as saving, deleting, etc).
Enabling Database Cache
Settings Module
You can enable database caching and default TTL using the Settings Module by navigating to Settings > System.
Environmental Configuration
You can also manage cache using the .env
file:
DB_CACHE=true
DB_CACHE_TTL=300
Configuration
And lastly you can set the config value dynamically at run time:
config([
'streams::database.cache' => true,
'streams::database.ttl' => 300,
]);
Caching Queries
You can set the cache lifetime in seconds
by using the ttl
method:
$results = $model->where('status', true)->ttl(300)->get();
Caching queries uses query strings and bindings to ensure uniqueness.{.note}
Fetching Fresh Results
If you are leveraging query caching you may want to temporarily omit cache. You can do this by using the fresh
method.
$results = $model->where('status', true)->fresh()->get();
Manually Flushing Cache
Model related cache is flushed automatically when entries are updated, created, or deleted.
You can manually flush the cache by using the model's flushCache
method:
$model->flushCache();
Clearing Cache
You can use the cache:clear
CLI command to clear all cache including database cache.
php artisan cache:clear
You can also clear all Laravel cache including database cache using php artisan cache:clear
.
Model TTL
Some models define their own default ttl
property. When database caching is enabled, queries for these models will be cached automatically by default.
protected $ttl = 300; // 5 minutes
If the value is null
(default) then the default TTL (3600 by default) will be used:
protected $ttl = null;
You can also disable default database caching for a model by using false
:
protected $ttl = false;
Translating
You can automatically join translation tables and therefore field values using the translate
method.
An optional locale
maybe passed otherwise the active locale will be used.
This method can not be called from the model to start a query like others.{.important}
$default = $model->newQuery()->translate()->where('name', 'Cool Thing')->get();
$german = $model->newQuery()->translate('de')->where('name', 'Coole Sache')->get();