[top-think/think]关联删除。软删除只会在主表的delete_time填充

2023-12-18 200 views
8

使用模型的关联删除,主表和从表都引入了软删除标记。操作进行后,只有主表被标记了删除。从表没有任何变化

回答

9

给出具体代码吧

2

1.控制器删除代码

        $id = $this->id;
        if (!$this->request->isAjax()) {
            return abort(404, lang('404 denied access'));
        }
        $info = AdminModel::get($id);
        if($info->together('hasOneRole')->delete()){
            return json(['code'=>1, 'msg'=> lang('delete success'), 'url'=> url('amember/index')]);
        }else{
            return json(['code'=>0, 'msg'=>lang('delete failed')]);
        }

2.admin模型

<?php
namespace app\admin\model;

use think\Model;
use traits\model\SoftDelete;

class Admin extends Model
{
    //引入软删除trait 和 定义软删除字段
    use SoftDelete;
    protected $deleteTime = 'delete_time';

    // 设置完整的数据表(包含前缀)
    protected $name = 'admin';

    //初始化属性
    protected function initialize()
    {
    }
    public function hasOneRole()
    {
        return $this->hasOne('AuthRoleUser', 'user_id', 'id');
    }
}
?>
  1. 关联表模型
    
    <?php
    /**
    * User: harlen
    * Date: 2017/2/14 0014 - 17:10
    *
    */

namespace app\admin\model;

use think\Model; use traits\model\SoftDelete;

class AuthRoleUser extends Model { use SoftDelete; protected $deleteTime = 'delete_time';

protected $name = 'auth_role_user';

public function authAdmin()
{
    return $this->hasOne('Admin','id', 'user_id');
}

}

1

你的一对一关联定义有问题吧 不可能两个都是hasOne的

5

together('hasOneRole') 删除这里只引用了这个关联方法。 从表里面的关联方法,是另一个业务逻辑用的。我没从together调用它,如果是因为从表的关联属性才发生这个问题, 那是否 together这方法就已经有BUG了?。

从xdebug单步调试。

softDelete 库,只自动生成了主表的delete_time

    /**
     * 删除当前的记录
     * @access public
     * @param bool  $force 是否强制删除
     * @return integer
     */
    public function delete($force = false)
    {
        if (false === $this->trigger('before_delete', $this)) {
            return false;
        }
        $name = $this->getDeleteTimeField();
        if (!$force) {
            // 软删除
            $this->change[]    = $name;
            $this->data[$name] = $this->autoWriteTimestamp($name);
            $result            = $this->isUpdate()->save();
        } else {
            $result = $this->db(false)->delete($this->data);
        }

        $this->trigger('after_delete', $this);
        return $result;
    }

model.php

        // 自动关联写入
        if (!empty($this->relationWrite)) {
            $relation = [];
            foreach ($this->relationWrite as $key => $name) {
                if (!is_numeric($key)) {
                    $relation[$key] = [];
                    foreach ($name as $val) {
                        if (isset($this->data[$val])) {
                            $relation[$key][$val] = $this->data[$val];
                            unset($this->data[$val]);
                        }
                    }
                } elseif (isset($this->data[$name])) {
                    $relation[$name] = $this->data[$name];
                    if (!$this->isUpdate) {
                        unset($this->data[$name]);
                    }
                }
            }
        }

这里也并没有生成从表的delete_time的代码 。