在專案開發中,業務的不同則對資料庫中資料的操作也是不一樣的, 例如有的資料表需要物理刪除資料記錄, 而有的資料表中的記錄需要假刪除(軟刪除),現在所使用的大部分框架都已經實現了對資料的這兩種操作. 那麼phalcon 中如何使用呢?
#phalcon 中的物理刪除 $model->delete();
在phalcon 中使用 $model->delete();預設執行的是物理刪除, 則資料庫中的資料記錄被刪除.
phalcon 中軟體刪除使用
phalcon 中提供了需要多類似鉤子的功能, 我理解的鉤子跟中間件的功能類似. phalcon 中有個方法是添加行為:
$this->addBehavior()
use Phalcon\Mvc\Model; use Phalcon\Mvc\Model\Behavior\SoftDelete; class Users extends Model{ const DELETED = "D"; const NOT_DELETED = "N"; public function initialize() { $this->addBehavior( new SoftDelete( [ "field" => "status", // 数据库中的字段 "value" => Users::DELETED, //修改数据库中status的值为D ] ) ); } }
如此, 在使用$model->delete() 方法的時候, 資料表中對應的欄位修改為 status = 'D' 實現了軟刪除的功能, 但是這樣會有什麼問題? 思考...
#這段程式碼在每一個model 中, 冗餘, 後續優化...那在寫的父類裡面BaseModel去實現, 所有的 model 繼承 BaseModel 都共用, 不錯...
#以上兩點一定要這麼做, 優點大家都懂. 那麼這樣就沒有問題了麼?
使用trail 分離代碼
根據業務的不同, 數據庫中數據的處理也不一樣, 有的model 需要軟刪除, 而有的model 需要物理刪除. 用下面的方法做:
namespace xxxx; use Phalcon\Mvc\Model\Behavior\SoftDelete; if (!trait_exists('ModelSoftDeletes')) { trait ModelSoftDeletes{ public function delete(){ $this->addBehavior( new SoftDelete([ "field" => "is_deleted", "value" => self::DELETED ]) ); return parent::delete(); } } }
在需要使用軟刪除的 model 中使用:
class Userodel extend Model { use ModelSoftDeletes; ...... }
ModelSoftDeletes 中的delete方法會覆蓋 Model 中的delete 方法, 在呼叫 $model->delete() 之前給目前的 model新增軟刪除的實作.
以上是phalcon 框架軟刪除與實體刪除解決方案的詳細內容。更多資訊請關注PHP中文網其他相關文章!