nghĩ tôi muốn đi cho cách Zed, nhưng cho đầy đủ:
Phương pháp nghe tổ chức sự kiện cho xóa (và chọn) cho hành vi xóa mềm chứa:
if (! $query->contains($field)) {
// do the magic stuff to covert the query to respect softdelete
}
Điều này có nghĩa rằng nếu bạn đề cập rõ ràng trường trong truy vấn, nó sẽ không áp dụng chuyển đổi cho truy vấn.
Vì vậy, nếu bạn làm:
$q = Doctrine_Query::create()
->delete('Table t')
->where('t.id = ? AND t.deleted != 2 ', 1);
nó sẽ không áp dụng các công cụ xóa mềm mại và thực sự sẽ xóa hồ sơ. Lưu ý rằng bạn có thể làm bất cứ điều gì với t.deleted, tôi đã thực hiện một cái gì đó mà sẽ luôn luôn là đúng sự thật. Bí danh ('t.') Cũng quan trọng để nó hoạt động.
Thủ thuật này cũng phù hợp với các lựa chọn, đây là nơi tôi thường sử dụng trước đây.
Như tôi đã nói, mặc dù tôi nghĩ rằng nó đẹp hơn để làm:
$old_dqlc = Doctrine_Manager::getInstance()->getAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS);
Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, false);
$record->delete();
Doctrine_Manager::getInstance()->setAttribute(Doctrine::ATTR_USE_DQL_CALLBACKS, $old_dqlc);
Đặc biệt, bạn vẫn có thể sử dụng phương pháp xóa() thay vì phải tự tạo các truy vấn. Một điểm cộng cho phương thức truy vấn là nếu bạn có các hành vi khác gắn liền với hồ sơ, chúng sẽ vẫn được tôn trọng.
Có lẽ bạn nên lưu trữ giá trị trước đó của Doctrine :: ATTR_USE_DQL_CALLBACKS thay vì đặt thành false và true. Điều gì xảy ra nếu CALLBACKS bị tắt trước khi mã đó gặp phải? –
vâng ... tôi nên ... chỉnh sửa. – benlumley
(mặc dù nếu callbacks tắt, xóa mềm không hoạt động) – benlumley