1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
<?php
namespace Illuminate\Tests\Integration\Database;
use Illuminate\Database\Eloquent\Casts\AsArrayObject;
use Illuminate\Database\Eloquent\Casts\AsCollection;
use Illuminate\Database\Eloquent\Casts\AsStringable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Str;
class DatabaseCustomCastsTest extends DatabaseTestCase
{
protected function defineDatabaseMigrationsAfterDatabaseRefreshed()
{
Schema::create('test_eloquent_model_with_custom_casts', function (Blueprint $table) {
$table->increments('id');
$table->text('array_object');
$table->text('collection');
$table->string('stringable');
$table->timestamps();
});
}
public function test_custom_casting()
{
$model = new TestEloquentModelWithCustomCasts;
$model->array_object = ['name' => 'Taylor'];
$model->collection = collect(['name' => 'Taylor']);
$model->stringable = Str::of('Taylor');
$model->save();
$model = $model->fresh();
$this->assertEquals(['name' => 'Taylor'], $model->array_object->toArray());
$this->assertEquals(['name' => 'Taylor'], $model->collection->toArray());
$this->assertEquals('Taylor', (string) $model->stringable);
$model->array_object['age'] = 34;
$model->array_object['meta']['title'] = 'Developer';
$model->save();
$model = $model->fresh();
$this->assertEquals([
'name' => 'Taylor',
'age' => 34,
'meta' => ['title' => 'Developer'],
], $model->array_object->toArray());
}
}
class TestEloquentModelWithCustomCasts extends Model
{
/**
* The attributes that aren't mass assignable.
*
* @var string[]
*/
protected $guarded = [];
/**
* The attributes that should be cast to native types.
*
* @var array
*/
protected $casts = [
'array_object' => AsArrayObject::class,
'collection' => AsCollection::class,
'stringable' => AsStringable::class,
];
}
|