yangakw yangakw

领域模型下的数据库表快速设计

in 代码read (85) 文章转载请注明来源!

领域模型设计中一切都是围绕着业务实现的,而且业务的核心都在领域模型中,这个模型可以理解成一些类的集合。
有关业务的属性和操作必须在模型中体现,这个模型是系统的核心,系统的其他分支必须围绕这个模型运作,当然也可以围绕模型重构。
既然业务核心都在领域模型,其实数据库只是一个存储方案,目的就是实现数据持久化,所以数据库可以有多种选择,如果选择mysql这种关系型数据库,我推荐这种方法,简单快捷。当然一些常用的属性最好不要这么做,这个方法效率不高,对于扩展属性还是比较适合的。
1.一个模型建一个表
2.id from_id field content created_at updated_at
3.在定义模型类时定义模型应有的属性,只不过在初始化和数据入库时做些处理,代码原理如下

    class UserExtends extends DMServiceAbstract
            {
            private $user_id;

            private $email       = '';
            private $valid_email = '';
            private $phone       = '';
            private $valid_phone = '';
            private $school      = '';
            private $major       = '';
            private $nianji      = '';
            private $country     = '';
            private $headerimg   = '';

            public function __call($sName, $aArgv)
            {
                $this->accessDeny();
                $fSub = substr($sName, 0, 3);
                switch ($fSub) {
                    case "set":
                        $elem = substr($sName, 3);
                        $elem = strtolower($elem);
                        $val  = isset($aArgv[0]) ? $aArgv[0] : '';
                        if (isset($this->$elem)) {
                            return $this->$elem = $val;
                        } else {
                            goto FATHER;
                        }
                    case "get":
                        $elem = substr($sName, 3);
                        $elem = strtolower($elem);
                        if (isset($this->$elem)) {
                            return $this->$elem;
                        } else {
                            goto FATHER;
                        }
                }
                FATHER:
                return '';
            }

            public function Initialize($user_id)
            {
                $this->user_id = $user_id;
                $eModel        = $this->getModel("UserExtends");
                $iData         = $eModel->select()
                    ->where(Condition::asAnd()->eq("user_id", $user_id))
                    ->run();
                /** @var UserExtends_MItem $v */
                foreach ($iData as $v) {
                    if (isset($v->field)) {
                        $key   = $v->field;
                        $value = $v->content;
                        if (isset($this->$key)) {
                            $this->$key = $value;
                        }
                    }
                }

            }

            public function save()
            {
                $this->accessDeny();
                $eModel       = $this->getModel("UserExtends");
                $user_id      = $this->user_id;
                $exist_field  = function ($field, $val) use ($eModel, $user_id) {
                    if (empty($val)) {
                        return -2; ##-2 不更新
                    }
                    /** @var UserExtends_MItem $tmp */
                    $tmp = $eModel->select()
                        ->where(Condition::asAnd()->eq("from_id", $user_id)->eq("field", $field))
                        ->limit(1)
                        ->run()
                        ->first();
                    if (is_object($tmp) && $tmp->id) {
                        if ($tmp->content == $val) {
                            return -2; ##-2 不更新
                        } else {
                            return $tmp->id; ## 返回id  更新
                        }
                    } else {
                        return -1; ##-1 插入数据
                    }
                };
                $insert_field = function ($k, $v) use ($eModel, $user_id) {
                    return $eModel->insert()
                        ->setMap([
                            "field"   => $k,
                            "content" => $v,
                            "from_id" => $user_id,
                        ])
                        ->run();
                };
                $update_field = function ($k, $v, $id) use ($eModel, $user_id) {
                    return $eModel->update()
                        ->setMap([
                            "field"   => $k,
                            "content" => $v,
                            "from_id" => $user_id,
                        ])
                        ->where(Condition::asAnd()->eq("id", $id))
                        ->run();
                };
                foreach ($this as $k => $v) {
                    if ($k != "user_id" || 0) {
                        $id = $exist_field($k, $v);
                        if ($id == -1) {  ##插入数据
                            $insert_field($k, $v);
                        } else { ##更新数据
                            if ($id > 0) {
                                $update_field($k, $v, $id);
                            }
                        }

                    }
                }
                return 11;
            }

            public function accessDeny()
            {
                if (empty($this->user_id)) {
                    exit("access deny");
                }
            }

        }
jrotty WeChat Pay

微信打赏

jrotty Alipay

支付宝打赏

文章二维码

扫描二维码,在手机上阅读!

发表新评论
博客已运行
© 2017 yangakw
PREVIOUS NEXT
雷姆
拉姆