EloquentCustomPivotCastTest.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. <?php
  2. namespace Illuminate\Tests\Integration\Database;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Database\Eloquent\Relations\Pivot;
  5. use Illuminate\Database\Schema\Blueprint;
  6. use Illuminate\Support\Facades\Schema;
  7. class EloquentCustomPivotCastTest extends DatabaseTestCase
  8. {
  9. protected function defineDatabaseMigrationsAfterDatabaseRefreshed()
  10. {
  11. Schema::create('users', function (Blueprint $table) {
  12. $table->increments('id');
  13. $table->string('email');
  14. });
  15. Schema::create('projects', function (Blueprint $table) {
  16. $table->increments('id');
  17. $table->string('name');
  18. });
  19. Schema::create('project_users', function (Blueprint $table) {
  20. $table->integer('user_id');
  21. $table->integer('project_id');
  22. $table->text('permissions');
  23. });
  24. }
  25. public function testCastsAreRespectedOnAttach()
  26. {
  27. $user = CustomPivotCastTestUser::forceCreate([
  28. 'email' => 'taylor@laravel.com',
  29. ]);
  30. $project = CustomPivotCastTestProject::forceCreate([
  31. 'name' => 'Test Project',
  32. ]);
  33. $project->collaborators()->attach($user, ['permissions' => ['foo' => 'bar']]);
  34. $project = $project->fresh();
  35. $this->assertEquals(['foo' => 'bar'], $project->collaborators[0]->pivot->permissions);
  36. }
  37. public function testCastsAreRespectedOnAttachArray()
  38. {
  39. $user = CustomPivotCastTestUser::forceCreate([
  40. 'email' => 'taylor@laravel.com',
  41. ]);
  42. $user2 = CustomPivotCastTestUser::forceCreate([
  43. 'email' => 'mohamed@laravel.com',
  44. ]);
  45. $project = CustomPivotCastTestProject::forceCreate([
  46. 'name' => 'Test Project',
  47. ]);
  48. $project->collaborators()->attach([
  49. $user->id => ['permissions' => ['foo' => 'bar']],
  50. $user2->id => ['permissions' => ['baz' => 'bar']],
  51. ]);
  52. $project = $project->fresh();
  53. $this->assertEquals(['foo' => 'bar'], $project->collaborators[0]->pivot->permissions);
  54. $this->assertEquals(['baz' => 'bar'], $project->collaborators[1]->pivot->permissions);
  55. }
  56. public function testCastsAreRespectedOnSync()
  57. {
  58. $user = CustomPivotCastTestUser::forceCreate([
  59. 'email' => 'taylor@laravel.com',
  60. ]);
  61. $project = CustomPivotCastTestProject::forceCreate([
  62. 'name' => 'Test Project',
  63. ]);
  64. $project->collaborators()->sync([$user->id => ['permissions' => ['foo' => 'bar']]]);
  65. $project = $project->fresh();
  66. $this->assertEquals(['foo' => 'bar'], $project->collaborators[0]->pivot->permissions);
  67. }
  68. public function testCastsAreRespectedOnSyncArray()
  69. {
  70. $user = CustomPivotCastTestUser::forceCreate([
  71. 'email' => 'taylor@laravel.com',
  72. ]);
  73. $user2 = CustomPivotCastTestUser::forceCreate([
  74. 'email' => 'mohamed@laravel.com',
  75. ]);
  76. $project = CustomPivotCastTestProject::forceCreate([
  77. 'name' => 'Test Project',
  78. ]);
  79. $project->collaborators()->sync([
  80. $user->id => ['permissions' => ['foo' => 'bar']],
  81. $user2->id => ['permissions' => ['baz' => 'bar']],
  82. ]);
  83. $project = $project->fresh();
  84. $this->assertEquals(['foo' => 'bar'], $project->collaborators[0]->pivot->permissions);
  85. $this->assertEquals(['baz' => 'bar'], $project->collaborators[1]->pivot->permissions);
  86. }
  87. public function testCastsAreRespectedOnSyncArrayWhileUpdatingExisting()
  88. {
  89. $user = CustomPivotCastTestUser::forceCreate([
  90. 'email' => 'taylor@laravel.com',
  91. ]);
  92. $user2 = CustomPivotCastTestUser::forceCreate([
  93. 'email' => 'mohamed@laravel.com',
  94. ]);
  95. $project = CustomPivotCastTestProject::forceCreate([
  96. 'name' => 'Test Project',
  97. ]);
  98. $project->collaborators()->attach([
  99. $user->id => ['permissions' => ['foo' => 'bar']],
  100. $user2->id => ['permissions' => ['baz' => 'bar']],
  101. ]);
  102. $project->collaborators()->sync([
  103. $user->id => ['permissions' => ['foo1' => 'bar1']],
  104. $user2->id => ['permissions' => ['baz2' => 'bar2']],
  105. ]);
  106. $project = $project->fresh();
  107. $this->assertEquals(['foo1' => 'bar1'], $project->collaborators[0]->pivot->permissions);
  108. $this->assertEquals(['baz2' => 'bar2'], $project->collaborators[1]->pivot->permissions);
  109. }
  110. }
  111. class CustomPivotCastTestUser extends Model
  112. {
  113. public $table = 'users';
  114. public $timestamps = false;
  115. }
  116. class CustomPivotCastTestProject extends Model
  117. {
  118. public $table = 'projects';
  119. public $timestamps = false;
  120. public function collaborators()
  121. {
  122. return $this->belongsToMany(
  123. CustomPivotCastTestUser::class, 'project_users', 'project_id', 'user_id'
  124. )->using(CustomPivotCastTestCollaborator::class)->withPivot('permissions');
  125. }
  126. }
  127. class CustomPivotCastTestCollaborator extends Pivot
  128. {
  129. protected $casts = [
  130. 'permissions' => 'json',
  131. ];
  132. }