2017-01-31 12 views
3

を更新しませんこの第二のアサートが失敗し、それは私が手動で行を追加する必要が動作するように:デタッチ機能は、私がテストに次のコードを持っている関係コレクション

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

私はいくつかをしないのですもの? belongsToMany関係でモデルを切り離すたびに、リレーションシップを手動でリロードする必要がありますか?そのことを本当にイライラする必要があります。これがそうである理由がありますか?

答えて

0

本当に状況です。

中間テーブルのうち適切なレコードを削除しますデタッチ方法。ただし、両方のモデルがデータベースに残ります。

はそのため、detachingsecond_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

+0

あなたは、私は – Alan

+1

「私は何かが足りないのですか?私は手動で私はbelongsToMany関係でモデルを切り離す関係毎回リロードする必要がありますか?」で説明するものには何も追加しませんでしたそして、私はそれが事実であると答え、あなたは事を逃していません。 –

+0

@OfirBaruchというのは、データベースにアタッチ/デタッチが行われ、リレーションレイヤーにカウントされたということですか? – viarnes

関連する問題