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 相关文章推荐
简单的过滤字符串中的HTML标记
Dec 25 PHP
php echo()和print()、require()和include()函数区别说明
Mar 27 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
Nov 07 PHP
基于PHP创建Cookie数组的详解
Jul 03 PHP
Laravel 5 框架入门(一)
Apr 09 PHP
thinkphp框架下404页面设置 仅三步
May 14 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
Sep 30 PHP
php导出csv文件,可导出前导0实例代码
Nov 16 PHP
thinkphp 手机号和用户名同时登录
Jan 20 PHP
完美解决Thinkphp3.2中插入相同数据的问题
Aug 01 PHP
在Laravel 中实现是否关注的示例
Oct 22 PHP
tp5.1框架数据库子查询操作实例分析
May 26 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实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
php使HTML标签自动补全闭合函数代码
2012/10/04 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
php伪静态验证码不显示的解决方案
2019/09/26 PHP
基于jquery的页面划词搜索JS
2010/09/14 Javascript
给页面渲染时间加速 干掉Dom Level 0 Event
2012/12/19 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
2013/05/14 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
使用js画图之画切线
2015/01/12 Javascript
2则自己编写的jQuery特效分享
2015/02/26 Javascript
javascript模拟php函数in_array
2015/04/27 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解
2015/11/09 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
2016/03/12 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
ES6入门教程之Class和Module详解
2017/05/17 Javascript
jQuery插件imgAreaSelect基础讲解
2017/05/26 jQuery
Vue2.0 实现单选互斥的方法
2018/04/13 Javascript
vuex(vue状态管理)的特殊应用案例分享
2020/03/03 Javascript
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
2019/07/23 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
韩国三星旗下的一家超市连锁店:Home Plus
2016/07/30 全球购物
软件工程师岗位职责
2013/11/16 职场文书
2014最新离职证明范本
2014/09/12 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书
Mysql数据库命令大全
2021/05/26 MySQL
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
python 字典和列表嵌套用法详解
2021/06/29 Python