分离功能不更新关系集合

时间:2017-01-31 14:30:00

标签: php laravel eloquent

我在测试中有以下代码:

$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());

第二个断言失败并使其工作我必须手动添加一行:

## Items [/item{?type}]

+ Parameters
    + type (enum[string], optional)
        + Default: foo
        + Members
            + foo
            + bar

### List [GET {&from}]

+ Parameters
    + page (integer, optional)
        + Default: 1

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

1 个答案:

答案 0 :(得分:0)

情况确实如此。

  

分离方法将删除相应的记录   中间表;但是,两种模型都将保留在数据库中。

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

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

简单来说:

共有2层:一层用于关系,另一层用于数据库。附加/分离功能仅在关系层上发生。而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