How to implement logical deletion in CakePHP2
Sep 3, 2020
PHP
CakePHP
cakephp2
#What is logical deletion? Logical deletion means that when the user sees it in a browser, it looks like it is being deleted, but the actual data is stored in a column prepared separately. Therefore, it is possible to restore deleted data from the administrator side.
#What is physical deletion? Delete the data in the database as well. Data cannot be recovered. This is the deletion method using the normal delete method.
#Explanation Download and install SoftDeleteBehavior.
https://github.com/CakeDC/utils/blob/master/Model/Behavior/SoftDeleteBehavior.php
Place the downloaded file in the app / Model / Behavior folder.
#Create a column for logical deletion in the table Delete flag Name: deleted Type: tinyint (1)
- Default value: 0
Delete date Name: deleted_date Type: datetime
Set the deleted column to 0 by default in the DB When the delete function is executed, it should be implemented so that 1 stands in the deleted column.
#Call the model you want to logically delete as follows
class Model name you want to use extends AppModel {
// Behavior for logical deletion
public $ actsAs = array ('SoftDelete');
Describe as follows in #AppModel.
class AppModel extends Model {
public function exists ($ id = null) {
if ($ this-> Behaviors-> loaded ('SoftDelete')) {
return $ this-> existsAndNotDeleted ($ id);
} else {
return parent :: exists ($ id);
}
}
public function delete ($ id = null, $ cascade = true) {
$ result = parent :: delete ($ id, $ cascade);
if ($ result === false && $ this-> Behaviors-> enabled ('SoftDelete')) {
return (bool) $ this-> field ('deleted', array ('deleted' => 1));
}
return $ result;
}
}
The above delete () is overwritten by softdelete, and it is in the form of update instead of deleting. Also, if there is a column name deleted, 1 will be set there.
#Controller looks like this
public function delete ($ id) {
$ this-> autoRender = false;
if ($ this-> request-> is ('get')) {
throw new MethodNotAllowedException ();
}
if ($ this-> User-> delete ($ id)) {
$ this-> Session-> setFlash ('Delete!');
$ this-> redirect (array ('action'=>' index'));
} else {
debug (__LINE__);
}
}
Yes, this is all right.