【问题标题】:Codeigniter 4 - using callbacks in modelCodeigniter 4 - 在模型中使用回调
【发布时间】:2020-09-26 07:54:55
【问题描述】:

假设我有一个名为“项目”的表。其中一列包含文件名字符串。 我想做的是在从数据库中删除行之后/之前删除文件。我明白了,Codeigniter 4 的模型现在可以使用回调函数。但我不知道如何访问数据,尤其是文件名字段。

<?php namespace App\Models;

use CodeIgniter\Model;

class ProjectModel extends Model {

    protected $table      = 'projects';
    protected $primaryKey = 'id';

    protected $returnType     = 'App\Entities\Project';
    protected $useSoftDeletes = false;

    protected $allowedFields = ['id', 'title', 'desc', 'filename'];

    protected $useTimestamps = true;
    protected $createdField  = 'created_at';
    protected $updatedField  = 'updated_at';

    protected $afterDelete = ['deleteFiles'];

    protected function deleteFiles() {
        // here i would like to delete the file
    }


}

还是我以错误的方式处理这个问题?我应该只在我的控制器中获取数据,删除文件然后从数据库中删除行吗?我会以这种方式在 CI3 中这样做,但现在我发现了 CI4 中的回调,我认为这是一种更优雅的方式/更好的做法。 谢谢。

编辑:

后来我发现,更好的办法是使用 beforeDelete 方法。但我无法访问当前行。如果我这样使用删除方法:

$this-&gt;projectsModel-&gt;delete(3);

我可以访问 Id:

protected $beforeDelete = ['deleteFiles'];

protected function deleteImages($data) {
    $id = $data['id'][0];
}

但是当我尝试一次删除更多行时: $this-&gt;projectModel-&gt;where('some_prop', 'XY')-&gt;delete(); 传递给 beforeDelete 函数的 $data 等于 NULL

【问题讨论】:

    标签: codeigniter-4


    【解决方案1】:

    有两种方法可以解决这个问题。 第一种方法是遵循 CRUD 操作的存储库模式。由于数据必须在行中,因此您需要先链接 find 函数,然后链接 delete 方法。

    另一种方法是覆盖子类中的删除函数。 afterDelete 触发器需要四个参数:id、purge、result、data。由于这是一个删除操作:结果将是布尔值,并且数据将为空,因为数据不存在。所以你可以做的是你可以覆盖删除函数以在它调用 afterDelete 触发器之前获取数据并将其传递给你正在使用的函数作为 afterDelete。

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 1970-01-01
      • 2021-04-08
      • 2016-09-27
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 2023-01-24
      • 1970-01-01
      相关资源
      最近更新 更多