EloquentBelongsToTest.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <?php
  2. namespace Illuminate\Tests\Integration\Database\EloquentBelongsToTest;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Database\Schema\Blueprint;
  5. use Illuminate\Support\Facades\Schema;
  6. use Illuminate\Support\Str;
  7. use Illuminate\Tests\Integration\Database\DatabaseTestCase;
  8. class EloquentBelongsToTest extends DatabaseTestCase
  9. {
  10. protected function defineDatabaseMigrationsAfterDatabaseRefreshed()
  11. {
  12. Schema::create('users', function (Blueprint $table) {
  13. $table->increments('id');
  14. $table->string('slug')->nullable();
  15. $table->unsignedInteger('parent_id')->nullable();
  16. $table->string('parent_slug')->nullable();
  17. });
  18. $user = User::create(['slug' => Str::random()]);
  19. User::create(['parent_id' => $user->id, 'parent_slug' => $user->slug]);
  20. }
  21. public function testHasSelf()
  22. {
  23. $users = User::has('parent')->get();
  24. $this->assertCount(1, $users);
  25. }
  26. public function testHasSelfCustomOwnerKey()
  27. {
  28. $users = User::has('parentBySlug')->get();
  29. $this->assertCount(1, $users);
  30. }
  31. public function testAssociateWithModel()
  32. {
  33. $parent = User::doesntHave('parent')->first();
  34. $child = User::has('parent')->first();
  35. $parent->parent()->associate($child);
  36. $this->assertEquals($child->id, $parent->parent_id);
  37. $this->assertEquals($child->id, $parent->parent->id);
  38. }
  39. public function testAssociateWithId()
  40. {
  41. $parent = User::doesntHave('parent')->first();
  42. $child = User::has('parent')->first();
  43. $parent->parent()->associate($child->id);
  44. $this->assertEquals($child->id, $parent->parent_id);
  45. $this->assertEquals($child->id, $parent->parent->id);
  46. }
  47. public function testAssociateWithIdUnsetsLoadedRelation()
  48. {
  49. $child = User::has('parent')->with('parent')->first();
  50. // Overwrite the (loaded) parent relation
  51. $child->parent()->associate($child->id);
  52. $this->assertEquals($child->id, $child->parent_id);
  53. $this->assertFalse($child->relationLoaded('parent'));
  54. }
  55. public function testParentIsNotNull()
  56. {
  57. $child = User::has('parent')->first();
  58. $parent = null;
  59. $this->assertFalse($child->parent()->is($parent));
  60. $this->assertTrue($child->parent()->isNot($parent));
  61. }
  62. public function testParentIsModel()
  63. {
  64. $child = User::has('parent')->first();
  65. $parent = User::doesntHave('parent')->first();
  66. $this->assertTrue($child->parent()->is($parent));
  67. $this->assertFalse($child->parent()->isNot($parent));
  68. }
  69. public function testParentIsNotAnotherModel()
  70. {
  71. $child = User::has('parent')->first();
  72. $parent = new User;
  73. $parent->id = 3;
  74. $this->assertFalse($child->parent()->is($parent));
  75. $this->assertTrue($child->parent()->isNot($parent));
  76. }
  77. public function testNullParentIsNotModel()
  78. {
  79. $child = User::has('parent')->first();
  80. $child->parent()->dissociate();
  81. $parent = User::doesntHave('parent')->first();
  82. $this->assertFalse($child->parent()->is($parent));
  83. $this->assertTrue($child->parent()->isNot($parent));
  84. }
  85. public function testParentIsNotModelWithAnotherTable()
  86. {
  87. $child = User::has('parent')->first();
  88. $parent = User::doesntHave('parent')->first();
  89. $parent->setTable('foo');
  90. $this->assertFalse($child->parent()->is($parent));
  91. $this->assertTrue($child->parent()->isNot($parent));
  92. }
  93. public function testParentIsNotModelWithAnotherConnection()
  94. {
  95. $child = User::has('parent')->first();
  96. $parent = User::doesntHave('parent')->first();
  97. $parent->setConnection('foo');
  98. $this->assertFalse($child->parent()->is($parent));
  99. $this->assertTrue($child->parent()->isNot($parent));
  100. }
  101. }
  102. class User extends Model
  103. {
  104. public $timestamps = false;
  105. protected $guarded = [];
  106. public function parent()
  107. {
  108. return $this->belongsTo(self::class, 'parent_id');
  109. }
  110. public function parentBySlug()
  111. {
  112. return $this->belongsTo(self::class, 'parent_slug', 'slug');
  113. }
  114. }