ThinkPHP模型中的HAS_ONE,BELONG_TO,HAS_MANY实践
因为很熟悉DJANGO,所以对TP,要慢慢适应。
1,SQL文件
/* Navicat MySQL Data Transfer Source Server : localhost_3306 Source Server Version : 50505 Source Host : localhost:3306 Source Database : thinkphp_inaction Target Server Type : MYSQL Target Server Version : 50505 File Encoding : 65001 Date: 2019-06-23 20:03:30 */ ; -- ---------------------------- -- Table structure for c5_post -- ---------------------------- DROP TABLE IF EXISTS `c5_post`; CREATE TABLE `c5_post` ( `post_id` ) unsigned NOT NULL AUTO_INCREMENT, `title` ) NOT NULL, `content` text NOT NULL, `created_at` ) NOT NULL, `updated_at` ) NOT NULL, `) NOT NULL, PRIMARY KEY (`post_id`) ) ENGINE DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of c5_post -- ---------------------------- '); '); -- ---------------------------- -- Table structure for c5_user -- ---------------------------- DROP TABLE IF EXISTS `c5_user`; CREATE TABLE `c5_user` ( `id` ) NOT NULL AUTO_INCREMENT, `username` ) NOT NULL, `password` ) NOT NULL, `created_at` ) NOT NULL, `updated_at` ) NOT NULL, PRIMARY KEY (`id`), KEY `username` (`username`) USING BTREE ) ENGINE DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of c5_user -- ---------------------------- '); -- ---------------------------- -- Table structure for c5_user_extra -- ---------------------------- DROP TABLE IF EXISTS `c5_user_extra`; CREATE TABLE `c5_user_extra` ( `id` ) NOT NULL AUTO_INCREMENT, `email` ) NOT NULL, `qq` ) NOT NULL, `) NOT NULL, PRIMARY KEY (`id`) ) ENGINE DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of c5_user_extra -- ---------------------------- ');
2,Application\Common\Conf\config.php
<?php
return array(
//'配置项'=>'配置值'
'DB_TYPE' => 'mysql',
'DB_HOST' => 'localhost',
'DB_PORT' => 3306,
'DB_USER' => 'root',
'DB_PWD' => 'xxxx',
'DB_NAME' => 'thinkphp_inaction',
'DB_PREFIX' => 'c5_'
);
3,Applicaton\Home\Model\UserModel.class.php
<?php
namespace Home\Model;
use Think\Model\RelationModel;
class UserModel extends RelationModel {
private $denyUserNames = array (
'admin',
'administraotr'
);
public $_validate = array(
array('username', 'require', 'user is not empty'),
array('password', 'require', 'password is not empty', 1, '', 1),
array('username', '', 'user has existed.', 0, 'unique', 1),
array('password', '6, 20', 'password length between 6~20', 0, 'length'),
array('password', '/^\w{6,20}$/', 'password format is error'),
array('password', 'repassword', 'confirm password is error', 0, 'confirm', 1),
array('username', 'checkUsername', 'user name is illegal', 0, 'callback'),
);
public $_auto = array(
array('password', 'md5', self::MODEL_BOTH, 'function'),
array('created_at', 'time', self::MODEL_INSERT, 'function'),
array('updated_at', 'time', self::MODEL_UPDATE, 'function')
);
public $_link = array(
'extra' => array(
'mapping_type' => self::HAS_ONE,
'class_name' => 'UserExtra',
'foreign_key' => 'user_id',
'mapping_fields' => 'email, qq'
),
'posts' => array(
'mapping_type' => self::HAS_MANY,
'class_name' => 'Post',
'foreign_key' => 'user_id'
)
);
public function checkUsername($username) {
foreach ($this->denyUserNames as $u) {
if (strpos($username, $u) !== false) {
return false;
}
}
return true;
}
}
?>
4,Applicaton\Home\Model\PostModel.class.php
<?php
/**
* Created by PhpStorm.
* User: Sahara
* Date: 2019/6/23
* Time: 19:00
*/
namespace Home\Model;
use Think\Model\RelationModel;
class PostModel extends RelationModel {
public $_link = array(
'author' => array(
'mapping_type' => self::BELONGS_TO,
'class_name' => 'User',
'foreign_key' => 'user_id',
)
);
}
5,Applicaton\Home\Model\PostViewModel.class.php
<?php
/**
* Created by PhpStorm.
* User: Sahara
* Date: 2019/6/23
* Time: 19:00
*/
namespace Home\Model;
use Think\Model\ViewModel;
class PostViewModel extends ViewModel {
public $viewFields = array(
'Post' => array(
'post_id',
'title',
'content',
'created_at',
'updated_at'
),
'User' => array(
'username' => 'author',
'_on' => 'Post.user_id=User.id'
)
);
}
6,Applicaton\Home\Controller\IndexController.class.php
<?php
namespace Home\Controller;
use Home\Model\PostModel;
use Home\Model\PostViewModel;
use Home\Model\UserModel;
use Think\Controller;
class IndexController extends Controller {
public function index(){
$user = new UserModel();
$data = array(
'username' => 'zhangsan',
'password' => '111111',
'repassword' => '111111'
);
if (!$user->create($data)) {
echo $user->getError();
exit;
} else {
$id = $user->add();
print_r($user->find($id));
}
echo 'ok';
}
public function posts() {
$m = new PostViewModel();
$data = $m->select();
print_r($data);
}
public function posts2() {
$m = new UserModel();
$data = $m->relation('extra')->find();
print_r($data);
}
public function posts3() {
$m = new PostModel();
$data = $m->relation('author')->find();
print_r($data);
}
public function posts4() {
$m = new UserModel();
$data = $m->relation('posts')->find();
print_r($data);
}
}

ThinkPHP模型中的HAS_ONE,BELONG_TO,HAS_MANY实践的更多相关文章
- thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法)
thinkphp模型中的获取器和修改器(根据字段名自动调用模型中的方法) 一.总结 记得看下面 1.获取器的作用是在获取数据的字段值后自动进行处理 2.修改器的作用是可以在数据赋值的时候自动进行转换处 ...
- thinkphp在模型中自动完成session赋值
相信用过thinkphp的用户都知道thinkphp的模型可以完成很多辅助功能,比 如自动验证.自动完成等,今天在开发中遇到自动完成中需要获取session值 然后自动赋值的功能,具体看代码:clas ...
- thinkphp模型事件(钩子函数:模型中在增删改等操作前后自动执行的事件)
thinkphp模型事件(钩子函数:模型中在增删改等操作前后自动执行的事件) 一.总结 1.通过模型事件(钩子函数),可以在插入更新删除等前后执行一些特定的功能 2.模型事件是写在模型里面的,控制器中 ...
- [Asp.net MVC]Asp.net MVC5系列——从控制器访问模型中的数据
目录 概述 从控制器访问模型中的数据 强类型模型与@model关键字 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net M ...
- 错误之thinkphp模型使用发生的错误
刚接触thinkphp模型的创建,在创建model类时在这里边声明了类的对象.唉,这是不理解的错误啊.什么叫做实例化模型对象,在控制器里边使用才创建. 模型这里写各种用到的函数. 这里我也体会到了查询 ...
- thinkphp模型层Model、Logic、Service讲解
thinkphp模型层Model.Logic.Service讲解 时间:2014-08-24 15:54:56 编辑:一切随缘 文章来源:php教程网 已阅读:771 次 js特效 ...
- ThinkPHP 模型(Model)命名规范
一个小问题搞了好久:如果数据库的表名中有下划线,那么在用thinkphp做自动完成时注意Model类的命名要变成驼峰法,文件名和类名都要变.( 另外注意:只有使用create方法创建数据时才能调用到自 ...
- 浅析Thinkphp框架中运用phprpc扩展模式
浅析Thinkphp框架中应用phprpc扩展模式 这次的项目舍弃了原来使用Axis2做web服务端的 方案,改用phprpc实现,其一是服务端的thinkphp已集成有该模式接口,其二是phprpc ...
- 关联模型中如果condition条件
在练习中,有一个user表和地址表,一对多的关系. 我的想法是,通过这个关联模型找出这个用户下面默认值字段为1的地址 控制器中 public function index(){ $User = D(' ...
随机推荐
- [MySQL] MySQL存储过程 事务transaction 数据表重建
直接上代码 -- 删除存储过程 DROP PROCEDURE IF EXISTS `renew_message_queue`; -- 添加; 的转义 DELIMITER ;; CREATE PROCE ...
- 【python库模块】Python subprocess模块功能与常见用法实例详解
前言 这篇文章主要介绍了Python subprocess模块功能与常见用法,结合实例形式详细分析了subprocess模块功能.常用函数相关使用技巧. 参考 1. Python subprocess ...
- IIS6远程代码执行漏洞复现CVE-2017-7269
简述 CVE-2017-7269是IIS 6.0中存在的一个栈溢出漏洞,在IIS6.0处理PROPFIND指令的时候,由于对url的长度没有进行有效的长度控制和检查,导致执行memcpy对虚拟路径进行 ...
- pytest_03_pycharm运行pytest (转:上海悠悠)
前言 上一篇pytest文档2-用例运行规则已经介绍了如何在cmd执行pytest用例,平常我们写代码在pycharm比较多 写完用例之后,需要调试看看,是不是能正常运行,如果每次跑去cmd执行,太麻 ...
- 西门子S7-300 设置IP、子网掩码
=============================================== 2019/7/17_第1次修改 ccb_warlock == ...
- Glances - Linux上的实时系统监控工具(Centos安装)
Glances WebServer 模式 在 glances 的 WebServer 模式下,客户端只通过浏览器访问就可以获取远程服务器的运行状态. 安装成功后,使用 glances -w 命令即可 ...
- 运行一个docker镜像并开机启动
记录,我用的liunx机是centos7.x 安装 安装Docker包$ sudo yum install docker-engine 启动Docker守护进程$ sudo service docke ...
- 微信JS-SDK实现分享功能
1 申请一个微信公众号,并确认在开发–接口权限中拥有分享功能的权限. 2 公众号设置–功能设置:在JS接口安全域名中添加安全域名,这个安全域名不是url,只需添加一级域名即可. 3 开发,基本配置中, ...
- tf.reduce_mean函数用法及有趣区别
sess=tf.Session() a=np.array([1,2,3,5.]) # 此代码保留为浮点数 a1=np.array([1,2,3,5]) # 此代码保留为整数 c=tf.reduce_m ...
- 【转载】C#中double.TryParse方法和double.Parse方法的异同之处
在C#编程过程中,double.TryParse方法和double.Parse方法都可以将字符串string转换为double类型,但两者还是有区别,最重要的区别在于double.TryParse方法 ...