CakePHP框架Model关联对象用法分析


Posted in PHP onAugust 04, 2017

本文实例讲述了CakePHP框架Model关联对象。分享给大家供大家参考,具体如下:

CakePHP 提供关联数据表间的映射,共有4种类型的关联:

hasOne,hasMany,belongTo,hasAndBelongsToMany.

设定了Model间的关联关系定义,CakePHP就会将基于关系数据库的数据映射为基于对象的关系模型。

但是你应该确保遵循CakePHP的命名规则.

命名规则中需要考虑的3个内容是,外键,model名字,表名.

外键:单数形式的 modelName_id
表名:复数形式的 model名
Model名:驼峰法命名单数形式(见文件inflector.php).

hasOne 关联的定义与查询:通过在model中增加一个array来实现.

class User extends AppModel
{
  var $name = 'User';
  var $hasOne = array(
    'UserInfos' => array(
      'className' => 'UserInfos',
      'conditions' => '',
      'order'=> '',
      'dependent' => true,
      'foreignKey' => 'user_id'
    )
  );
}

$hasOne 变量是一个array,CakePHP 通过该变量来构建 Blog 与 User 之间的关联。

className: 关联对象的类名。
conditions: 关联对象的选择条件。
order: 关联对象的排列方式。
dependent: 这是个布尔值,如果为 true,父对象删除时会级联删除关联子对象。
foreignKey: 指向关联 Model 的外键字段名,仅在不遵循 Cake 的命名约定时需要设置。

belongsTo 关联的定义与使用

class Blog extends AppModel
{
  var $name = 'Blog';
  var $belongsTo = array(
    'User' => array(
      'className' => 'User',
      'conditions' => '',
      'order' => '',
      'foreignKey' => 'user_id'
    )
  );
}

className: 关联对象的类名。
conditions: SQL 条件子句以限定关联的对象。
order: 关联对象的排序子句。
foreignKey: 关联对象所对应的外键字段名。

hasMany 关联的定义与查询

class User extends AppModel
{
  var $name = 'User';
  var $hasMany = array(
    'Blog' => array(
      'className' => 'Blog',
      'conditions' => 'Blog.status = 1',
      'order' => 'Blog.created DESC',
      'limit' => '5',
      'foreignKey' => 'user_id',
      'dependent' => true,
      'exclusive' => false, 'finderQuery' => ''
    )
  );
}

$hasMany array 用来定义 User 包含多条 Blog 这样的关联关系。

className: 关联对象类名。
conditions: 关联对象限定条件。
order: 关联对象排列子句。

limit: 用 limit 来限定检索的关联对象数量。

foreignKey: 外键字段名。
dependent: 是否级联删除。
exclusive: 如果为 TRUE,所有的关联对象将在一句 SQL 中删除,model 的 beforeDelete 回调函数不会被执行。
finderQuery: 定义一句完整的 SQL 语句来检索关联对象,能够对关联规则进行最大程度上的控制。

同样可以为 Blog 加上关联 User 对象的 belongTo 关联。

hasAndBelongsToMany 关联的定义与查询。

class Blog extends AppModel
{
  var $name = 'Blog';
  var $hasAndBelongsToMany = array('Tag' =>
    array('className'  => 'Tag',
       'joinTable'  => 'blogs_tags',
       'foreignKey'  => 'blog_id',
       'associationForeignKey'=> 'tag_id',
       'conditions'  => '',
       'order'    => '',
       'limit'    => '',
       'uniq'     => true,
       'finderQuery' => '',
       'deleteQuery' => '',
    )
    );
}

$hasAndBelongsToMany array 是定义 HABTM 关联的变量。

className: 关联对象类名。
joinTable: 如果没有遵循 Cake 的命名约定建立关联表,则需要设置该 key 来指定关联表。
foreignKey: 定义本 mode 在关联表中的外键字段。
associationForeignKey: 关联表中指向关联对象的外键字段名。
conditions:  关联对象限定条件。
order: 关联对象排序子句。
limit: 关联对象数量限制。
uniq: 设为 true 的话,重复的关联对象将被过滤掉。
finderQuery: 完整的关联对象检索语句。
deleteQuery: 完整的删除关联关系的SQL 语句。

保存关联对象:

当关联的两个对象都没有持久化,你需要首先持久化主对象。

在保存子对象时要把父对象的 ID 保持在子对象中。

保存 hasAndBelongsToMany 关联对象:

使用 bindModel()unbindModel() 实时地改变关联关系:

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
聊天室php&mysql(五)
Oct 09 PHP
PHP中遍历stdclass object的实现代码
Jun 09 PHP
php生成略缩图代码
Jul 16 PHP
ThinkPHP3.1新特性之Action参数绑定
Jun 19 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
Jul 28 PHP
php随机显示指定文件夹下图片的方法
Jul 13 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
详解WordPress开发中wp_title()函数的用法
Jan 07 PHP
php ajax异步读取rss文档数据
Mar 29 PHP
PHP+jQuery实现双击修改table表格功能示例
Feb 21 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 PHP
解决Laravel使用验证时跳转到首页的问题
Nov 17 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
Aug 04 #PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
Aug 04 #PHP
php7安装yar扩展的方法详解
Aug 03 #PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
Aug 03 #PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 #PHP
Kindeditor编辑器添加图片上传水印功能(php代码)
Aug 03 #PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
Aug 03 #PHP
You might like
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
AJAX的跨域访问-两种有效的解决方法介绍
2013/06/22 PHP
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
PHP入门教程之面向对象基本概念实例分析
2016/09/11 PHP
php微信公众平台开发(一) 配置接口
2016/12/06 PHP
php四种定界符详解
2017/02/16 PHP
老生常谈PHP位运算的用途
2017/03/12 PHP
PHP函数按引用传递参数及函数可选参数用法示例
2018/06/04 PHP
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
jquery实现通用的内容渐显Tab选项卡效果
2015/09/07 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
JavaScript 消息框效果【实现代码】
2016/04/27 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
Javascript 判断两个IP是否在同一网段实例代码
2016/11/28 Javascript
微信小程序实现图片放大预览功能
2020/10/22 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
Python从MP3文件获取id3的方法
2015/06/15 Python
利用信号如何监控Django模型对象字段值的变化详解
2017/11/27 Python
详解Python中 sys.argv[]的用法简明解释
2017/12/20 Python
Python DataFrame.groupby()聚合函数,分组级运算
2018/09/18 Python
django框架自定义模板标签(template tag)操作示例
2019/06/24 Python
python 伯努利分布详解
2020/02/25 Python
家长写给老师的建议书
2014/03/13 职场文书
实习协议书范本
2014/09/25 职场文书
世界气象日活动总结
2015/02/27 职场文书
详解Java ES多节点任务的高效分发与收集实现
2021/06/30 Java/Android
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers