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加密解密的代码
Oct 09 PHP
聊天室php&mysql(四)
Oct 09 PHP
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
Jan 15 PHP
PHP has encountered an Access Violation at 7C94BD02解决方法
Aug 24 PHP
php对大文件进行读取操作的实现代码
Jan 23 PHP
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
Jan 20 PHP
PHP扩展开发教程(总结)
Nov 04 PHP
PHP上传文件参考配置大文件上传
Dec 16 PHP
php中分页及SqlHelper类用法实例
Jan 12 PHP
PHP基于SPL实现的迭代器模式示例
Apr 22 PHP
Laravel 之url参数,获取路由参数的例子
Oct 21 PHP
实例讲解PHP表单
Jun 10 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
Terran兵种介绍
2020/03/14 星际争霸
php生成SessionID和图片校验码的思路和实现代码
2009/03/10 PHP
PHP 文件扩展名 获取函数
2009/06/03 PHP
PHP simple_html_dom.php+正则 采集文章代码
2009/12/24 PHP
PHP 字符串长度判断效率更高的方法
2014/03/02 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
向JavaScript的数组中添加元素的方法小结
2015/10/24 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
基于BootStrap实现局部刷新分页实例代码
2016/08/08 Javascript
解决拦截器对ajax请求的拦截实例详解
2016/12/21 Javascript
vuejs2.0实现分页组件使用$emit进行事件监听数据传递的方法
2017/02/22 Javascript
JavaScript学习笔记之函数记忆
2017/09/06 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
vue学习笔记之slot插槽基本用法实例分析
2020/02/01 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
跟老齐学Python之不要红头文件(2)
2014/09/28 Python
python使用fork实现守护进程的方法
2017/11/16 Python
python 计算一个字符串中所有数字的和实例
2019/06/11 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
世界最大的私人旅行指南出版商:孤独星球
2016/08/23 全球购物
养殖项目策划书范文
2014/01/13 职场文书
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
音乐专业自荐信
2014/02/07 职场文书
社会工作专业自荐信
2014/09/26 职场文书
2014年科研工作总结
2014/12/03 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
运动会运动员赞词
2015/07/22 职场文书