gpt4 book ai didi

php - 分离函数不更新关系集合

转载 作者:搜寻专家 更新时间:2023-10-31 21:51:09 24 4
gpt4 key购买 nike

我在测试中有以下代码:

$post = factory(Post::class)->create();

$first_tag = factory(Tag::class)->create();
$second_tag = factory(Tag::class)->create();


$post->tags()->attach($first_tag);
$post->tags()->attach($second_tag);

$this->assertEquals(2, $post->tags->count());

直到一切正常,然后我在断言行下添加以下代码:

$post->tags()->detach($second_tag);

$this->assertEquals(1, $post->tags->count());

第二个断言失败,为了让它工作,我必须手动添加一行:

$post->tags()->detach($second_tag);
$post->load('tags');
$this->assertEquals(1, $post->tags->count());

我错过了什么吗?每次在 belongsToMany 关系中分离模型时,是否必须手动重新加载关系?不得不这样做真的很令人沮丧。这有什么原因吗?

最佳答案

确实是这样。

The detach method will remove the appropriate record out of the intermediate table; however, both models will remain in the database.

因此,即使在 分离 second_tag 之后,$post->tags->count 也不是最新的并且仍然保持该值,就好像模型没有分离一样。

这就是为什么在重新加载关系后它确实有效。

简单来说:

有两层:一层是关系,另一层是数据库。附加/分离功能仅发生在关系层上。而 count 访问数据库层,而数据库层不知道关系层的修改。

无论如何如何计算标签?

这不是最漂亮的解决方案,但您可以设置一个变量,其初始值将是返回的 count() 值,然后通过增加/减少它来维护它。

$countTags = $post->tags->count();

$post->tags()->attach($first_tag);
$countTags++;

$post->tags()->attach($second_tag);
$countTags++;

$post->tags()->detach($second_tag);
$countTags--;

Source

关于php - 分离函数不更新关系集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41960085/

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