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 相关文章推荐
一个颜色轮换的简单例子
Oct 09 PHP
修改Zend引擎实现PHP源码加密的原理及实践
Apr 14 PHP
PHP5+UTF8多文件上传类
Oct 17 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
Aug 23 PHP
PHP性能优化准备篇图解PEAR安装
Dec 05 PHP
ThinkPHP3.1新特性之多层MVC的支持
Jun 19 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
Jul 25 PHP
微信自定义菜单的处理开发示例
Apr 16 PHP
PHP Reflection API详解
May 12 PHP
thinkphp5 URL和路由的功能详解与实例
Dec 26 PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
Mar 06 PHP
PHP如何使用JWT做Api接口身份认证的实现
Feb 03 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
php实例分享之mysql数据备份
2014/05/19 PHP
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
php生出随机字符串
2017/07/06 PHP
php操作redis常见方法示例【key与value操作】
2020/04/14 PHP
jquery 锁定弹出层实现代码
2010/02/23 Javascript
window.addEventListener来解决让一个js事件执行多个函数
2012/12/26 Javascript
Jquery树插件zTree用法入门教程
2015/02/17 Javascript
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
Vue实现双向绑定的方法
2016/12/22 Javascript
Vue系列:通过vue-router如何传递参数示例
2017/01/16 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
小程序使用wxs解决wxml保留2位小数问题
2019/12/13 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
NumPy 数学函数及代数运算的实现代码
2018/07/18 Python
flask中的wtforms使用方法
2018/07/21 Python
详解Python3 中的字符串格式化语法
2020/01/15 Python
Python基于百度AI实现OCR文字识别
2020/04/02 Python
芬兰汽车配件商店:Autonvaraosat24
2017/01/30 全球购物
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
台湾三立电视电商平台:电电购
2019/09/09 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?
2016/08/18 面试题
物流仓管员工作职责
2014/01/06 职场文书
物业管理计划书
2014/01/10 职场文书
颂军魂爱军营演讲稿
2014/09/13 职场文书
分居协议书范本(律师见证版)
2014/11/26 职场文书
新郎答谢词
2015/01/04 职场文书
2015年实习单位评语
2015/03/25 职场文书
第二次离婚起诉书
2015/05/18 职场文书
运动会开幕式新闻稿
2015/07/17 职场文书
创业开店,这样方式更合理
2019/08/26 职场文书
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android