Migrations
Introduction
In general migrations in the Streams Platform work just like migrations in Laravel. Except now you can leverage the streams
, fields
, and assignments
repositories to scaffold your database automatically.
Migrations in the database/migrations directory are ran last during system installation.{.tip}
Generating Migrations
You can generate migrations just like you normally would using make:migration
with the addition of a few options.
Addon Migrations
To target a specific addon to generate your migration in you can use the --addon
option:
php artisan make:migration change_phone_to_text_field_type --addon=anomaly.module.contacts
Default Migrations
You can also create "normal" migrations by omitting the --fields
and --stream
options. This will create a migration very similar to Laravel migrations with the exception that the fields
, streams
, and assignments
repositories are all available to use.
php artisan make:migration make_widgets_trashable --addon=example.module.test
Then populate your migration:
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class AnomalyModulePagesMakePagesSearchable extends Migration
{
public function up()
{
$stream = $this->streams()->findBySlugAndNamespace('widgets', 'example');
$stream
->setAttribute('trashable', true)
->save();
}
public function down()
{
$stream = $this->streams()->findBySlugAndNamespace('widgets', 'example');
$stream
->setAttribute('trashable', false)
->save();
}
}
Migration Types
Stream Migrations
You can create streams via stream repositories directly but you may prefer using a stream
migration to simplify things. You can create a stream migration by using --stream=stream_slug
option.
php artisan make:migration create_example_stream --addon=example.module.test --stream=widgets
Then populate your migration:
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class AnomalyModuleTestCreateWidgetsStream extends Migration
{
protected $delete = true; // Delete stream on rollback
protected $stream = [
'slug' => 'widgets',
'title_column' => 'name',
'translatable' => true,
'searchable' => false,
'trashable' => true,
];
protected $assignments = [
'name' => [
'required' => true,
'translatable' => true,
],
'slug' => [
'required' => true,
'unique' => true,
],
'description' => [
'translatable' => true,
],
];
}
Field Migrations
You can create fields
via field repositories directly but you may prefer using a field
migration to simplify things. You can create a field migration by using the --fields
option flag.
php artisan make:migration create_more_fields --addon=example.module.test --fields
Now you can populate the generated migration:
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class AnomalyModuleTestCreateMoreFields extends Migration
{
protected $fields = [
'first_name' => 'anomaly.field_type.text',
'last_name' => 'anomaly.field_type.text',
'siblings' => [
'type' => 'anomaly.field_type.multiple',
'config' => [
'mode' => 'lookup',
'related' => \Anomaly\TestModule\Person\PersonModel::class,
],
],
];
}
And lastly run the migration:
php artisan migrate --addon=anomaly.module.test
Appending Stream Data
Often times you will need to append streams information by adding fields, assignments, or updating streams.
Using Definitions
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class AnomalyModuleTestAddExampleField extends Migration
{
/**
* Don't delete stream on rollback
* because this isn't creating the
* stream only referencing it.
*/
protected $delete = false;
/**
* Any additional information will
* be updated. Slug helps find
* the stream to work with for
* assignments that follow.
*/
protected $stream = [
'slug' => 'widgets',
];
/**
* This field will be added.
*/
protected $fields = [
'example' => 'anomaly.field_type.boolean',
];
/**
* These assignments will be
* created for the stream above.
*/
protected $assignments = [
'example' => [
'required' => true,
'translatable' => true,
],
];
}
Using Repositories
You can also use the fields
, streams
, and assignments
repositories bundled in the migration.
<?php
use Anomaly\Streams\Platform\Database\Migration\Migration;
class AnomalyModulePagesMakePagesSearchable extends Migration
{
public function up()
{
$stream = $this->streams()->findBySlugAndNamespace('widgets', 'example');
$stream
->setAttribute('trashable', true)
->save();
}
public function down()
{
$stream = $this->streams()->findBySlugAndNamespace('widgets', 'example');
$stream
->setAttribute('trashable', false)
->save();
}
}
Defining Custom Namespaces
When creating field you must provide a namespace
to create the fields in. By default the slug
of the addon the migration resides in will be used as the namespace
. You can also define the $namespace
property if the addon slug does not suffice:
protected $namespace = 'example';
Lastly you can define the namespace inline with the stream and and assignment definitions:
protected $stream = [
'slug' => 'widgets',
'namespaces' => 'example',
'title_column' => 'name',
'translatable' => true,
'trashable' => true,
];
protected $assignments = [
'name' => [
'namespace' => 'example',
'translatable' => true,
'required' => true,
],
];
Being able to set the namespace like this means you can create streams and assign fields for any namespace from anywhere without modifying core code.{.tip}