当前位置: 首页 > news >正文

长沙公司做网站ofo的网站用什么做的

长沙公司做网站,ofo的网站用什么做的,wordpress 插件 翻译,建筑行业资讯网站ThinkPHP6 模型层的模型属性#xff0c;表映射关系#xff0c;以及模型层的CRUD及如何在控制层中使用模型层 1. model 模型层的默认映射规则 模型#xff0c;即mvc模式中的model层#xff0c;model层用来对接数据库#xff0c;操作数据库的增删改查。 在tp6中#xff…ThinkPHP6 模型层的模型属性表映射关系以及模型层的CRUD及如何在控制层中使用模型层 1. model 模型层的默认映射规则 模型即mvc模式中的model层model层用来对接数据库操作数据库的增删改查。 在tp6中模型会自动对应数据表模型类的命名规则是除去表前缀的数据表名称采用驼峰法命名并且首字母大写的方式。和控制层视图层一样也需要导入相应的类库think\Model。 模型名与数据库的对应关系例如下表 模型名约定对应数据表假设数据库的前缀定义是 robin_Userrobin_userStudentInforobin_student_info 当然也可以不像上面这样写这时候就需要自己在对应的模型类中通过属性protected $table xxx来设定。 2. 举例自定义model映射表名 假定你的表名叫stu_info,然后你的模型类为Student那么为了使其相对应就需要修改一下属性。那么写个小例子测试一下 config/database.php 默认配置: ?phpreturn [// 默认使用的数据库连接配置default env(database.driver, mysql),// 自定义时间查询规则time_query_rule [],// 自动写入时间戳字段// true为自动识别类型 false关闭// 字符串则明确指定时间字段类型 支持 int timestamp datetime dateauto_timestamp true,// 时间字段取出后的默认时间格式datetime_format Y-m-d H:i:s,// 时间字段配置 配置格式create_time,update_timedatetime_field ,// 数据库连接配置信息connections [mysql [// 数据库类型type env(database.type, mysql),// 服务器地址hostname env(database.hostname, 127.0.0.1),// 数据库名database env(database.database, phpdemo),// 用户名username env(database.username, root),// 密码password env(database.password, root),// 端口hostport env(database.hostport, 3306),// 数据库连接参数params [],// 数据库编码默认采用utf8charset env(database.charset, utf8),// 数据库表前缀 设定为 robin_prefix env(database.prefix, robin_),// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)deploy 0,// 数据库读写是否分离 主从式有效rw_separate false,// 读写分离后 主服务器数量master_num 1,// 指定从服务器序号slave_no ,// 是否严格检查字段是否存在fields_strict true,// 是否需要断线重连break_reconnect false,// 监听SQLtrigger_sql env(app_debug, true),// 开启字段缓存fields_cache false,],// 更多的数据库配置信息], ];model层 ?php namespace app\model;use think\Model; // 引入模型基类class Student extends Model {// 将数据表名设定为为指定的 stu_info ,如果不配置的话我们找到的对应的表名应为robin_studentprotected $table stu_info;public function queryAll(){$data Student::select();return $data-toArray();} } 控制器层 ?php namespace app\controller;use app\BaseController; use app\model\Student; use think\facade\View; // 使用模板引擎 use think\model;class test extends BaseController{public function index(){// 这里拿控制器测试一下能否查到正确的数据$model new Student();$data $model-queryAll();dump($data) ;} }成功查到这里只是顺带说明一下后面会详细的说… 3. 如何在控制器中使用模型层 在控制器中使用模型层只需要将think\model引入然后在控制器的方法中实例化模型对象即可. 单应用目录结构如下 在app目录下controller ,view ,model处于同级目录。 控制器 ?php namespace app\controller;use app\BaseController; use app\model\Student; use think\model; // 使用模型class test extends BaseController{public function index(){// 实例化模型层对象$model new Student();// 调用模型对象的方法$data $model-queryAll();dump($data) ;} }模型层 ?php namespace app\model;use think\Model; // 引入模型基类class Student extends Model {protected $table stu_info;public function queryAll(){$data Student::select();return $data-toArray();} }4. 模型层设置属性自定义表名主键… 常用的模型设置属性包括以下属性都不是必须设置的是为了灵活的结合项目使用 属性描述name模型名相当于不带数据表前后缀的表名默认为当前模型类名table数据表名默认自动获取suffix数据表后缀默认为空pk主键名默认为idconnection数据库连接默认读取数据库配置query模型使用的查询类名称field模型允许写入的字段列表数组schema模型对应数据表字段及类型type模型需要自动转换的字段及类型strict是否严格区分字段大小写默认为truedisuse数据表废弃字段数组 上述的模型设置属性都可以自定义配置即修改默认的模型设置。 假定我现在有一张下面的数据表vendors,其中主键为vend_id(与默认配置不符合) 那么我的模型层可以修改成下面的样子 ?php namespace app\model;use think\Model; // 引入模型基类class Vendors extends Model {// 自定义表名protected $table vendors;// 自定义主键名protected $pk vend_id;public function queryAll(){// 查询主键为1002的数据信息$data Vendors::find(1002);return $data-toArray();} }写个控制器测试下 ?php namespace app\controller;use app\BaseController; use app\model\Vendors; use think\model;class test extends BaseController{public function index(){$model new Vendors();$data $model-queryAll();// 输出dump($data) ;} }其余的模型设置也是一样根据自己不同的需求去进行修改对应的属性即可。 5. 模型的crud 增删改查 5.1 新增数据 create saveAll 新增数据的最佳实践原则使用create方法新增数据使用saveAll批量新增数据。 create create 为 类提供的静态方法可以直接通过类名来调用。 create 方法源码如下 /*** 写入数据* access public* param array $data 数据数组* param array $allowField 允许字段* param bool $replace 使用Replace* param string $suffix 数据表后缀* return static*/ public static function create(array $data, array $allowField [], bool $replace false, string $suffix ): Model {$model new static();if (!empty($allowField)) {$model-allowField($allowField);}if (!empty($suffix)) {$model-setSuffix($suffix);}$model-replace($replace)-save($data);return $model; }根据源码我们只需要将新增的数据封装为一个数组即可完成最简单的添加例如 ?php namespace app\model;use think\Model; // 引入模型基类class Student extends Model {protected $table stu_info;// ...// 新增一个添加表数据的方法public function insertSt(){$st Student::create([name张张,birthtime(y-m-d),subjectphp,snum202004041020,label测试新增]);// 这里将st对象返回return $st;} }控制器修改调用一下 ?php namespace app\controller;use app\BaseController; use app\model\Student; use app\model\Vendors; use think\model;class test extends BaseController{public function index(){$model new Student();$data $model-insertSt();// 打印数据dump($data) ;} }测试一下新增成功 saveAll saveAll方法新增数据默认会自动识别数据是需要新增还是更新操作当数据中存在主键的时候会认为是更新操作。 saveAll方法新增数据返回的是包含新增模型带自增ID的数据集对象。 saveAll方法需要类模型对象来调用不是静态方法。 saveAll源码 /*** 保存多个数据到当前数据对象* access public* param iterable $dataSet 数据* param boolean $replace 是否自动识别更新和写入* return Collection* throws \Exception*/ public function saveAll(iterable $dataSet, bool $replace true): Collection {$db $this-db();$result $db-transaction(function () use ($replace, $dataSet) {$pk $this-getPk();$result [];$suffix $this-getSuffix();// 迭代器foreach ($dataSet as $key $data) {if ($replace) {$exists true;foreach ((array) $pk as $field) {// 主键判断设定existsif (!isset($data[$field])) {$exists false;}}}// 判断主键是否存在存在则为更新操作if ($replace !empty($exists)) {$result[$key] static::update($data, [], [], $suffix);} else {$result[$key] static::create($data, $this-field, $this-replace, $suffix);}}return $result;});return $this-toCollection($result); }分析下源码为啥saveAll可以批量添加数据是因为其内部有一个iterable的迭代器然后在迭代过程中进行了一些判断是否使新增还是更新操作以完成批量新增。 前面的例子使用了create添加单个数据现在我们使用saveAll来批量添加数据: 模型: ?php namespace app\model;use think\Model; // 引入模型基类class Student extends Model {protected $table stu_info;// 批量新增public function insertStMul(){$st new Student();$list [[namedemo1,birth2023-05-21,subjectphp,snum202004041021,label测试批量新增1],[namedemo2,birth2023-05-21,subjectphp,snum202004041022,label测试批量新增2]];$coll $st-saveAll($list);return $coll;} }控制器: ?php namespace app\controller;use app\BaseController; use app\model\Student; use app\model\Vendors; use think\facade\View; // 使用模板引擎 use think\model;class test extends BaseController{public function index(){$model new Student();$data $model-insertStMul();dump($data) ;} }5.2 删除数据 delete destory 删除的最佳实践原则是如果删除当前模型数据用delete方法如果需要直接删除数据使用destroy静态方法。 delete delete 方法返回值类型为布尔值源码如下 /*** 删除当前的记录* access public* return bool*/ public function delete(): bool {if (!$this-exists || $this-isEmpty() || false $this-trigger(BeforeDelete)) {return false;}// 读取更新条件$where $this-getWhere();$db $this-db();$db-transaction(function () use ($where, $db) {// 删除当前模型数据$db-where($where)-delete();// 关联删除if (!empty($this-relationWrite)) {$this-autoRelationDelete();}});$this-trigger(AfterDelete);$this-exists false;$this-lazySave false;return true; }使用delete方法删除模型数据可以在查询后调用delete方法。 $user User::find(1); $user-delete();或者直接使用对象删除 $user new User(); // 删除id为1 的数据 $user-where(id,,1)-delete();destory destory 为静态方法可以直接通过类来调用然后返回值为布尔值。 当destroy方法传入空值包括空字符串和空数组的时候不会做任何的数据删除操作但传入0则是有效的 源码如下 /*** 删除记录* access public* param mixed $data 主键列表 支持闭包查询条件* param bool $force 是否强制删除* return bool*/ public static function destroy($data, bool $force false): bool {if (empty($data) 0 ! $data) {return false;}$model new static();$query $model-db();if (is_array($data) key($data) ! 0) {$query-where($data);$data null;} elseif ($data instanceof \Closure) {$data($query);$data null;}$resultSet $query-select($data);foreach ($resultSet as $result) {$result-force($force)-delete();}return true; }使用destory()方法时直接通过类调用即可根据主键删除 User::destroy(1); // 支持批量删除多个数据 User::destroy([1,2,3]);destory()闭包删除的方式 User::destroy(function($query){$query-where(id,,10); });5.3 修改更新数据 save update 更新的最佳实践原则是如果需要使用模型事件那么就先查询后更新save如果不需要使用事件或者不查询直接更新直接使用静态的Update方法进行条件更新如非必要尽量不要使用批量更新。 save 先查询后更新推荐 在取出数据后更改字段内容后使用save方法更新数据。这种方式是最佳的更新方式。 $user User::find(1); $user-name thinkphp; $user-email thinkphpqq.com; $user-save();save方法成功返回true并只有当before_update事件返回false的时候返回false有错误则会抛出异常。 tip:save方法更新数据只会更新变化的数据对于没有变化的数据是不会进行重新更新的。 save源码 /*** 保存当前数据对象* access public* param array $data 数据* param string $sequence 自增序列名* return bool*/ public function save(array $data [], string $sequence null): bool {// 数据对象赋值$this-setAttrs($data);if ($this-isEmpty() || false $this-trigger(BeforeWrite)) {return false;}$result $this-exists ? $this-updateData() : $this-insertData($sequence);if (false $result) {return false;}// 写入回调$this-trigger(AfterWrite);// 重新记录原始数据$this-origin $this-data;$this-get [];$this-lazySave false;return true; }update 直接更新 使用模型的静态update方法更新 User::update([name thinkphp], [id 1]);模型的update方法返回模型的对象实例 如果你的第一个参数中包含主键数据可以无需传入第二个参数更新条件 User::update([name thinkphp, id 1]);如果你需要只允许更新指定字段可以使用 User::update([name thinkphp, email thinkphpqq.com], [id 1], [name]);上面的代码只会更新name字段的数据。 update源码 /*** 更新数据* access public* param array $data 数据数组* param mixed $where 更新条件* param array $allowField 允许字段* param string $suffix 数据表后缀* return static*/ public static function update(array $data, $where [], array $allowField [], string $suffix ) {$model new static();if (!empty($allowField)) {$model-allowField($allowField);}if (!empty($where)) {$model-setUpdateWhere($where);}if (!empty($suffix)) {$model-setSuffix($suffix);}$model-exists(true)-save($data);return $model; }update方法底层还是使用了save方法。 5.4 查询数据 find select 查询构造器 模型查询和数据库查询方法的区别主要在于模型中的查询的数据在获取的时候会经过获取器的处理以及更加对象化的获取方式。 模型查询除了使用自身的查询方法外一样可以使用数据库的查询构造器返回的都是模型对象实例。但如果直接调用查询对象的方法IDE可能无法完成自动提示。 获取单个数据 find find 方法返回值为当前模型对象。默认参数为null值传入的话会视为主键条件。 find源码 /*** 查找单条记录* access public* param mixed $data 查询数据* return array|Model|null|static|mixed* throws Exception* throws ModelNotFoundException* throws DataNotFoundException*/ public function find($data null) {if (!is_null($data)) {// AR模式分析主键条件$this-parsePkWhere($data);}if (empty($this-options[where]) empty($this-options[order])) {$result [];} else {$result $this-connection-find($this);}// 数据处理if (empty($result)) {return $this-resultToEmpty();}if (!empty($this-model)) {// 返回模型对象$this-resultToModel($result);} else {$this-result($result);}return $result; }获取单个数据的方法 // 取出主键为1的数据 $user User::find(1); echo $user-name;// 使用查询构造器查询满足条件的数据 $user User::where(name, thinkphp)-find(); echo $user-name;模型使用find方法查询如果数据不存在返回Null否则返回当前模型的对象实例。 使用isEmpty方法来判断当前是否为一个空模型。 $user User::where(name, thinkphp)-findOrEmpty(); if (!$user-isEmpty()) {echo $user-name; }如果是在模型内部获取数据不要使用$this-name的方式来获取数据而是使用$this-getAttr(name) 替代。 获取多个数据 select select 可以查询多条数据返回值为collection。参数默认不写为null值给出后会视为主键条件。 select 源码 /*** 查找记录* access public* param mixed $data 数据* return Collection|array|static[]* throws Exception* throws ModelNotFoundException* throws DataNotFoundException*/ public function select($data null): Collection {if (!is_null($data)) {// 主键条件分析$this-parsePkWhere($data);}$resultSet $this-connection-select($this);// 返回结果处理if (!empty($this-options[fail]) count($resultSet) 0) {$this-throwNotFound();}// 数据列表读取后的处理if (!empty($this-model)) {// 生成模型对象$resultSet $this-resultSetToModelCollection($resultSet);} else {$this-resultSet($resultSet);}return $resultSet; }例如取出多个数据 // 根据主键获取多个数据 $list User::select([1,2,3]); // 对数据集进行遍历操作 foreach($list as $key$user){echo $user-name; }使用查询构造器 链式操作 在模型中仍然可以调用数据库的链式操作和查询方法可以充分利用数据库的查询构造器的优势。 例如 User::where(id,10)-find(); User::where(status,1)-order(id desc)-select(); User::where(status,1)-limit(10)-select();使用查询构造器直接使用静态方法调用即可无需先实例化模型。 获取某个字段或者某个列的值: // 获取某个用户的积分 User::where(id,10)-value(score); // 获取某个列的所有值 User::where(status,1)-column(name); // 以id为索引 User::where(status,1)-column(name,id);value和column方法返回的不再是一个模型对象实例而是纯粹的值或者某个列的数组。
http://www.w-s-a.com/news/943276/

相关文章:

  • hype做网站动效哪里有给网站做
  • 打扑克网站推广软件设计类专业哪个最好
  • 网站设计首页网站建设意向书
  • 做网站要学那些angularjs后台管理系统网站
  • 广州白云手机网站建设学做点心上哪个网站
  • 哈尔滨网站建设步骤百度青岛代理公司
  • 怎么利用代码做网站军队 网站备案
  • 百度手机版网址免费广州seo
  • 军博做网站公司wordpress评论插件
  • 如何申请一个网站 做视频网站报错解析
  • 徐州高端网站建设无锡找做网站
  • 网站如何不需要备案百度的宣传视频广告
  • 如何用易语言做网站采购系统有哪些
  • 建一个网站容易吗浙江省城乡建设厅官网
  • 奇点网站建设黄骅贴吧百度贴吧
  • 站长爱it如何分析网站设计
  • 服装公司网站定位seo网站关键词
  • 电商网站开发流程文档南京 seo 价格
  • 网站建设任务分解张家港网站制作服务
  • 化州+网站建设网络营销怎么做推广
  • 贵阳网站设计方案阿里云 wordpress 数据库
  • 如何做购物返佣金网站高校 网站建设实施方案
  • 网站如何连接微信支付网页制作与网站开发
  • 地名网站建设方案营销型网站策划书
  • 网站优化排名查询网站图片怎么做的高级
  • 官方网站建设调研报告小程序短链接生成
  • 专做耐克阿迪鞋网站免费微信网站模板下载
  • 视频在线制作网站wordpress怎么调用友情链接
  • 做微商什么是官方网站温州阀门外贸网站建设
  • 申请主机网站网站建设平台合同模板