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 foreach循环使用详解与实例代码
May 08 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
Nov 01 PHP
PHP模块 Memcached功能多于Memcache
Jun 14 PHP
Could not load type System.ServiceModel.Activation.HttpModule解决办法
Dec 29 PHP
基于PHP Web开发MVC框架的Smarty使用说明
Apr 19 PHP
php post大量数据时发现数据丢失问题解决方法
Jun 20 PHP
Zend Framework教程之Zend_Db_Table用法详解
Mar 21 PHP
php mysql 封装类实例代码
Sep 18 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
Aug 28 PHP
PHP+mysql实现的三级联动菜单功能示例
Feb 15 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
May 09 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
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
探讨如何在PHP开启gzip页面压缩实例
2013/06/09 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
2014/12/04 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
Yii2创建控制器(createController)方法详解
2016/07/23 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
JavaScript Prototype对象
2009/01/07 Javascript
jQuery的deferred对象使用详解
2011/08/20 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
动态读取JSON解析键值对的方法
2014/06/03 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
jQuery Tags Input Plugin(添加/删除标签插件)详解
2016/06/20 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
AngularJS全局scope与Isolate scope通信用法示例
2016/11/22 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
jquery 禁止鼠标右键并监听右键事件
2017/04/27 jQuery
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
vue 使用element-ui中的Notification自定义按钮并实现关闭功能及如何处理多个通知
2019/08/17 Javascript
Python实现从脚本里运行scrapy的方法
2015/04/07 Python
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
Python通过zookeeper实现分布式服务代码解析
2020/07/22 Python
英国综合网上购物商城:The Hut
2018/07/03 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
护理职业应聘自荐书
2013/09/29 职场文书
个人求职简历的自我评价
2013/10/19 职场文书
学徒工职责
2014/03/06 职场文书
个人剖析材料范文
2014/09/30 职场文书
2014年电信员工工作总结
2014/12/19 职场文书
最感人的道歉情书
2015/05/12 职场文书
小王子读书笔记
2015/06/29 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
初中班长竞选稿
2015/11/20 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
如何创建一个创建MySQL数据库中的datetime类型
2022/03/21 MySQL