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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
<?php
namespace App\Integration\Database;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Illuminate\Tests\Integration\Database\DatabaseTestCase;
/**
* @group integration
*/
class EloquentCollectionLoadCountTest extends DatabaseTestCase
{
protected function setUp(): void
{
parent::setUp();
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('some_default_value');
$table->softDeletes();
});
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('post_id');
});
Schema::create('likes', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('post_id');
});
$post = Post::create();
$post->comments()->saveMany([new Comment, new Comment]);
$post->likes()->save(new Like);
Post::create();
}
public function testLoadCount()
{
$posts = Post::all();
DB::enableQueryLog();
$posts->loadCount('comments');
$this->assertCount(1, DB::getQueryLog());
$this->assertSame('2', $posts[0]->comments_count);
$this->assertSame('0', $posts[1]->comments_count);
$this->assertSame('2', $posts[0]->getOriginal('comments_count'));
}
public function testLoadCountOnDeletedModels()
{
$posts = Post::all()->each->delete();
DB::enableQueryLog();
$posts->loadCount('comments');
$this->assertCount(1, DB::getQueryLog());
$this->assertSame('2', $posts[0]->comments_count);
$this->assertSame('0', $posts[1]->comments_count);
}
public function testLoadCountWithArrayOfRelations()
{
$posts = Post::all();
DB::enableQueryLog();
$posts->loadCount(['comments', 'likes']);
$this->assertCount(1, DB::getQueryLog());
$this->assertSame('2', $posts[0]->comments_count);
$this->assertSame('1', $posts[0]->likes_count);
$this->assertSame('0', $posts[1]->comments_count);
$this->assertSame('0', $posts[1]->likes_count);
}
public function testLoadCountDoesNotOverrideAttributesWithDefaultValue()
{
$post = Post::first();
$post->some_default_value = 200;
Collection::make([$post])->loadCount('comments');
$this->assertSame(200, $post->some_default_value);
$this->assertSame('2', $post->comments_count);
}
}
class Post extends Model
{
use SoftDeletes;
protected $attributes = [
'some_default_value' => 100,
];
public $timestamps = false;
public function comments()
{
return $this->hasMany(Comment::class);
}
public function likes()
{
return $this->hasMany(Like::class);
}
}
class Comment extends Model
{
public $timestamps = false;
}
class Like extends Model
{
public $timestamps = false;
}
|