2015-09-23 20 views
9

Tôi mới sử dụng propel và tôi đang tìm cách tăng giá trị trong cơ sở dữ liệu MySQL của mình mà không cần phải thực hiện toàn bộ chu trình đọc-cập nhật. Như thế này:Giá trị gia tăng trong cơ sở dữ liệu bằng cách sử dụng Propel

UPDATE books SET popularity = popularity + 1 WHERE id = 123 

Dĩ nhiên tôi có thể làm:

$book = new BookQuery::create()->findPk(123); 
$book->setPopularity($book->getPopularity() + 1); 
$book->save(); 

Nhưng điều đó sẽ cho kết quả trong 2 truy vấn (SELECT và UPDATE).

Có cách nào gọn gàng để thực hiện việc này trong Propel không?

+0

Bạn có thể thực hiện SQL thẳng trong propel; nếu không, bạn có thể sử dụng kết hợp create() -> filterBy() -> update() để thực hiện những gì bạn muốn. – versalle88

+0

Tôi biết tôi có thể làm SQL thẳng trong Propel, nhưng tôi chỉ muốn hiểu cách giải quyết vấn đề này với Propel. Ngoài ra nếu tôi sử dụng update(), cú pháp sẽ trông như thế nào để tăng giá trị? –

Trả lời

1

Có cách nào gọn gàng để thực hiện việc này trong Propel không?

Không, nhưng có một cách. ;) Bạn có thể sử dụng tham số Criteria::CUSTOM_EQUAL với Criteria->add():

$con = Propel::getConnection(BooksPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); 
$whereCriteria = BooksQuery::create()->filterById(123); 
$valuesCriteria = new Criteria(BooksPeer::DATABASE_NAME); 
$valuesCriteria->add(BooksPeer::POPULARITY, BooksPeer::POPULARITY . " + 1", Criteria::CUSTOM_EQUAL); 
BasePeer::doUpdate($whereCriteria, $valuesCriteria, $con); 

Đây là cách sắp xếp được hành vi implements rank chuyển.

0
BasePeer::doUpdate($whereCriteria, $valuesCriteria, $con); 

doUpdate() là một chức năng riêng tư không thể sử dụng bên ngoài.

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