2010-07-14 15 views
8

yılında modelin değerini yenilemek için zorlamak için:nasıl en Yazarken ben B.</p> <p>ilişkin model A var diyelim yii

$a = A::model()->findByPK(1); 
$a->B->doSomething(); 

ve şimdi B için başka bir kullanıcı tarafından (değişmiş olabilir tarafından örneği). Ben yazarken: Bu B'nin eski değerleri kullanır

$a->B->doSomething(); 

Ben doSomething önce B'nin değerini yenilemek için zorlamak için yapması gerekenler().

cevap

0

A modelinde B ilişkisi bildirildiğinde, B nesnesini, $ a-> B olarak çağırdığınızda veritabanından "tembel yüklendi" olarak anlıyoruz. Önbelleğe alınmadığı sürece (ki bunu varsayılan olarak düşünmüyorum) bu ilişkiyi her aradığınızda B kopyasının yeni bir kopyasını almalı.

Eğer doSomething() B içindeki verileri değiştiriyorsa, bunu B-> doSomething() içinde $ this-> save() olarak adlandırırsınız. B'yi değiştiriyor ancak değişiklikleri kaydetmiyorsanız, B için tekrar sorguladığınızda, aynı eski içeriğe sahip olacaktır.

<?php 
function doSomething() { 
    $this->my_data++; // change something 
    $this->save(); // save the changes 
} 
?> 

siz değiştirmediğiniz sonra tekrar B erişmek istediğiniz ama bunu kaydetmiş önce, sen tür, "cache" kendisine bir bir değişkende ayarlamak gerekecektir. Aksi takdirde, $ a-> B (ve doSomething() içindeki değişikliği kaydetmediğinizde) veritabanından yeni bir kopyasını aldığından, eski verilere sahip olacaksınız. Böyle bir şey yerine çalışacaktır:

<?php 
$a = A::model()->findByPK(1); 
$B = $a->B; // save B 
$B->doSomething(); // change B 
$B->doSomething(); // change the changed B again 
$B->save(); // save both changes 
?> 

o (size "başka bir kullanıcı tarafından değiştiğini" derken olabilir öyle gibi) genel eşzamanlılık sorunu ise, kilidin çeşit uygulamak gerekebilir Veri bütünlüğünü sağlamak için mekanizmayı veya mySql işlemlerini (Yii'nin CDbTransaction yoluyla) kullanın.

bunların hiçbiri belki şöyle yanı sorununuzu çözecektir bir "hevesli" yük yapıyor, çalışıyorsa:

<?php 
$posts=A::model()->with('B')->findAll(); 
?> 
+0

Yii dahil olmak üzere tüm doğal ilişkilerin tümünü yenilemek için ilişkiler önbelleğe alınır. –

10

Sen söyleyerek tazelenmiş 'B' değerini elde edebilirsiniz:

$a->getRelated('B',true)->doSomething(); 

2 param "doğru" yii veritabanından ilişkiyi yeniden ister. Yii2 yılında

4

onun sadece basit Bu konuda çok

unset($model->relation); 

unset($a->b)

0

$ a-> B-> refresh(); sadece B yenilemek için //

$ a- > Yenile(); // ve "B"

İlgili konular