EloquentModelJsonCastingTest.php 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. namespace Illuminate\Tests\Integration\Database\EloquentModelJsonCastingTest;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Database\Schema\Blueprint;
  5. use Illuminate\Support\Collection;
  6. use Illuminate\Support\Facades\Schema;
  7. use Illuminate\Tests\Integration\Database\DatabaseTestCase;
  8. use stdClass;
  9. class EloquentModelJsonCastingTest extends DatabaseTestCase
  10. {
  11. protected function defineDatabaseMigrationsAfterDatabaseRefreshed()
  12. {
  13. Schema::create('json_casts', function (Blueprint $table) {
  14. $table->increments('id');
  15. $table->json('basic_string_as_json_field')->nullable();
  16. $table->json('json_string_as_json_field')->nullable();
  17. $table->json('array_as_json_field')->nullable();
  18. $table->json('object_as_json_field')->nullable();
  19. $table->json('collection_as_json_field')->nullable();
  20. });
  21. }
  22. public function testStringsAreCastable()
  23. {
  24. /** @var \Illuminate\Tests\Integration\Database\EloquentModelJsonCastingTest\JsonCast $object */
  25. $object = JsonCast::create([
  26. 'basic_string_as_json_field' => 'this is a string',
  27. 'json_string_as_json_field' => '{"key1":"value1"}',
  28. ]);
  29. $this->assertSame('this is a string', $object->basic_string_as_json_field);
  30. $this->assertSame('{"key1":"value1"}', $object->json_string_as_json_field);
  31. }
  32. public function testArraysAreCastable()
  33. {
  34. /** @var \Illuminate\Tests\Integration\Database\EloquentModelJsonCastingTest\JsonCast $object */
  35. $object = JsonCast::create([
  36. 'array_as_json_field' => ['key1' => 'value1'],
  37. ]);
  38. $this->assertEquals(['key1' => 'value1'], $object->array_as_json_field);
  39. }
  40. public function testObjectsAreCastable()
  41. {
  42. $object = new stdClass;
  43. $object->key1 = 'value1';
  44. /** @var \Illuminate\Tests\Integration\Database\EloquentModelJsonCastingTest\JsonCast $user */
  45. $user = JsonCast::create([
  46. 'object_as_json_field' => $object,
  47. ]);
  48. $this->assertInstanceOf(stdClass::class, $user->object_as_json_field);
  49. $this->assertSame('value1', $user->object_as_json_field->key1);
  50. }
  51. public function testCollectionsAreCastable()
  52. {
  53. /** @var \Illuminate\Tests\Integration\Database\EloquentModelJsonCastingTest\JsonCast $user */
  54. $user = JsonCast::create([
  55. 'collection_as_json_field' => new Collection(['key1' => 'value1']),
  56. ]);
  57. $this->assertInstanceOf(Collection::class, $user->collection_as_json_field);
  58. $this->assertSame('value1', $user->collection_as_json_field->get('key1'));
  59. }
  60. }
  61. /**
  62. * @property $basic_string_as_json_field
  63. * @property $json_string_as_json_field
  64. * @property $array_as_json_field
  65. * @property $object_as_json_field
  66. * @property $collection_as_json_field
  67. */
  68. class JsonCast extends Model
  69. {
  70. public $table = 'json_casts';
  71. public $timestamps = false;
  72. protected $guarded = [];
  73. public $casts = [
  74. 'basic_string_as_json_field' => 'json',
  75. 'json_string_as_json_field' => 'json',
  76. 'array_as_json_field' => 'array',
  77. 'object_as_json_field' => 'object',
  78. 'collection_as_json_field' => 'collection',
  79. ];
  80. }