2016-04-03 22 views
0

が、私はこのまわりで私の頭を取得することはできません動作しません:フラグメントが作成された後、常に1つのみありますのでテストoneToMany関係Laravel、雄弁は

$fragment = factory(Fragment::class)->create(); 

$this->assertCount(0, $fragment->values); 

fragment->fetch(); // updates the 'values' by adding one Value object. 

var_dump($fragment->id); // i.e. 6 
var_dump(Fragment::first()->id); // 6 

var_dump($fragment->values->count()); // 0 
var_dump(Fragment::first()->values->count()); // 1 

$this->assertCount(1, $fragment->values); 

私は、DatabaseTranscationsを使用しています。したがって、$ fragmentとFragment :: first()はまったく同じインスタンスです。しかし、値の関係は異なります。これはどうしたらできますか?私は手動で私のコントローラを介してこれをテストする場合、これは、テスト中にのみ起こること

注意(および値は、ブレードのテンプレートページに渡されます)それだけで正常に動作します。私は混乱している:S。

アイデア?

答えて

1

リレーションシップ属性($fragment->values)は一度だけロードされます。関係から項目を追加または削除するときに最新の状態に保たれません。彼らは変更を確認するたびにデータベースにヒットしません。

2行目は$this->assertCount(0, $fragment->values);です。 $fragment->valuesにアクセスすると、ここでは関係が怠惰に読み込まれ、あなたの主張が証明するように、それは空です。

$fragment->fetch()を呼び出して、Valueオブジェクトをフラグメントに追加しているというコメントが表示されます。ただし、関係属性($fragment->values)はすでに前のステートメントからロードされているため、関係に追加した追加のValueオブジェクトは反映されません。

したがって、fetch()を呼び出した後でも、$fragment->valuesは空のコレクションになります。 Fragment::first()->valuesは、Fragmentの新しいインスタンスを取得しているので、新たに関連するValueを含んでいます。初めてvaluesをロードすると、関連するValueが表示されます。あなたが関係をリロードする必要がある場合

は、あなたがload()メソッドを使用することができます。 fetch()に電話した後にこれを追加した場合(またはfetch()の方法に入れた方が意味をなさない場合)、テストは正常に動作します。

$fragment = factory(Fragment::class)->create(); 

$this->assertCount(0, $fragment->values); 

$fragment->fetch(); // updates the 'values' by adding one Value object. 

var_dump($fragment->id); // i.e. 6 
var_dump(Fragment::first()->id); // 6 

var_dump($fragment->values->count()); // 0 

// reload the values relationship 
$fragment->load('values'); 

var_dump($fragment->values->count()); // 1 
var_dump(Fragment::first()->values->count()); // 1 

$this->assertCount(1, $fragment->values); 

あなたが持っている他のオプションではなく、関係属性の関係メソッドにアクセスすることにより、関係クエリを使用することです。 $fragment->values()->count()(注:valuesではなく、values())を実行すると、毎回データベースに当てられ、常に現在のカウントが返されます。

+0

優れています。これはうまく動作します。不思議なことに、私はドキュメントを読んで、上記の動作を見つけたり、理解したりしませんでした。もちろん、熱心な読み込み(https://laravel.com/docs/5.2/eloquent-relationships#lazy-eager-loading)への言及があります。 –