2010-07-14 25 views
8

giả sử tôi có mô hình A với mối quan hệ với B.làm thế nào để ép buộc để làm mới giá trị của mô hình trong yii

Khi tôi viết:

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

và bây giờ B có thể bằng cách thay đổi (bởi người dùng khác cho ví dụ). Khi tôi viết:

$a->B->doSomething(); 

nó sử dụng giá trị cũ B. Tôi nên làm gì để buộc làm mới giá trị của B trước doSomething().

Trả lời

0

Khi tôi hiểu nó khi mối quan hệ B được khai báo trong mô hình của A, đối tượng B đang được "nạp chậm" từ cơ sở dữ liệu khi bạn gọi $ a-> B. Trừ khi nó đang được lưu trữ (mà nó không làm theo mặc định tôi không nghĩ) nó nên được lấy một bản sao tươi của B mỗi khi bạn gọi mối quan hệ đó.

Tôi sẽ đảm bảo rằng nếu doSomething() đang thay đổi dữ liệu trong B, bạn cũng gọi $ this-> save() bên trong B-> doSomething(). Nếu bạn đang thay đổi B nhưng không lưu các thay đổi thì khi bạn truy vấn lại B, nó sẽ có cùng nội dung cũ.

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

Nếu bạn muốn truy cập B một lần nữa sau khi bạn đã thay đổi nó nhưng trước khi bạn đã lưu nó, bạn sẽ cần phải đặt nó trong một biến trong A đến "bộ nhớ cache" nó, loại. Nếu không, vì nó nhận được một bản sao mới từ cơ sở dữ liệu khi bạn gọi $ a-> B (và bạn không lưu thay đổi trong doSomething()), bạn sẽ có dữ liệu cũ. Một cái gì đó như thế này sẽ làm việc thay vì:

<?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 
?> 

Nếu nó là một vấn đề đồng thời chung (mà có vẻ như nó có thể là khi bạn nói "nó đã thay đổi bởi một người dùng khác"), bạn có thể cần phải thực hiện một số loại khóa cơ chế, hoặc sử dụng các giao dịch mySql (thông qua CDBTransaction của Yii) để đảm bảo tính toàn vẹn của dữ liệu.

Nếu không ai trong số này hoạt động, có lẽ làm một "háo hức" tải sẽ khắc phục vấn đề của bạn là tốt, như vậy:

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

Yii có quan hệ bộ nhớ cache. –

10

Bạn có thể nhận được một giá trị làm mới 'B' bằng cách nói:

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

Các param 2 "true" hỏi rằng yii lại mối quan hệ từ cơ sở dữ liệu.

4

Trong Yii2 của nó chỉ là một đơn giản

unset($model->relation); 

như vậy trong trường hợp này unset($a->b)

0

$ a-> B-> làm mới(); // để làm mới chỉ B

$ a- > làm mới(); // để làm mới và tất cả các mối quan hệ tự nhiên bao gồm "B"

Các vấn đề liên quan