【问题标题】:Detach function not updating the relationship collection分离函数不更新关系集合
【发布时间】:2017-06-17 00:54:01
【问题描述】:

我在测试中有以下代码:

$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 关系中分离模型时,是否必须手动重新加载关系?不得不这样做真的很令人沮丧。这有什么原因吗?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    确实是这样。

    detach 方法会从 中间表;但是,这两个模型都将保留在数据库中。

    因此,即使在 detachingsecond_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

    【讨论】:

    • 你没有在我解释的内容中添加任何内容
    • “我错过了什么吗?每次我在 belongsToMany 关系中分离模型时,我是否必须手动重新加载关系?”我回答说是这样,你不会错过任何东西。
    • @OfirBaruch 你的意思是附加/分离发生在数据库中并依靠关系层,对吧?
    • 那么有没有像count这样的功能来检查数据库中的记录数量?我不想重新加载关系。
    • Amm...您可以设置一个变量来保存计数的值,并在附加/分离后 - 只需更新它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 2016-01-13
    • 2014-11-04
    • 1970-01-01
    相关资源
    最近更新 更多