gpt4 book ai didi

php - 为什么 PHP/Laravel 不增加这个值?

转载 作者:行者123 更新时间:2023-12-03 17:33:20 26 4
gpt4 key购买 nike

使用 Laravel 5 和 sqlite 进行单元测试。我有一个简单的测试,其中 User 创建了一个 Post

/** @test */
public function it_should_increment_post_count_when_a_user_makes_a_post()
{
// Given
$u = User::first();
$count1 = $u->posts->count();
var_dump($count1);

// When
$p = new Post();
$p->title = 'My Title';
$p->content = 'This is the content';
$p->user_id = $u->id;
$p->save(); // This is definitely saving
$count2 = $u->posts->count();
var_dump($count2);

// Then
$this->assertEquals($count1+1, $count2);
}

结果如下:

root@7053bd7f558c:/var/www/laravel# phpunit
PHPUnit 5.5.7 by Sebastian Bergmann and contributors.

.....Fint(11)
int(11)
. 7 / 7 (100%)

Time: 1.98 seconds, Memory: 12.00MB

There was 1 failure:

1) BasicUserTest::it_should_increment_post_count_when_a_user_makes_a_post
Failed asserting that 11 matches expected 12.

/var/www/laravel/tests/BasicUserTest.php:96

FAILURES!
Tests: 7, Assertions: 11, Failures: 1.

它肯定会保存到数据库中(如果我在没有 use DatabaseTransactions; 的情况下运行它,它每次都会递增)。 $count1 是否以某种方式引用了 $u->posts->count()

编辑:类似的变化会产生一个奇怪的属性:

/** @test */
public function it_should_increment_post_count_when_a_user_makes_a_post()
{
// Given
$p = new Post([
'title' => 'tha title',
'content' => 'tha content',
]);
$u_old = User::first();
var_dump($u_old->posts->count());

// When
$u_old->posts()->save($p);

// Then
$u_new = User::first();
$this->assertEquals($u_old->posts->count()+1, $u_new->posts->count());
}

这行得通,但如果我注释掉行 var_dump($u_old->posts->count());,它就会失败。

最佳答案

当你这样写的时候:

$u->posts->count();

模型中缓存的不是count()。它是 posts 关系。您正在获取该用户的所有帖子作为集合(基本上是一个美化的数组),然后计算中的项目数集合。

如果您只需要帖子的数量,您应该加载整个集合。仅当您确实需要有关每个帖子的详细信息时才应加载集合。

相反,这样做:

$u->posts()->count();

注意帖子后的()。这意味着您实际上是在构建查询以选择帖子总数。这:

  1. 需要更少的内存(Eloquent 对象很大)
  2. 在您的数据库上会更容易(从表中选择计数而不是 *)
  3. 将从数据库中提取新鲜信息,并且每次调用时都是准确的

关于php - 为什么 PHP/Laravel 不增加这个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40312817/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com