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与分页效率
Jun 04 PHP
探讨如何在php168_cms中提取验证码
Jun 08 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
Jul 01 PHP
调试PHP程序的多种方法介绍
Nov 06 PHP
php中base_convert()进制数字转换函数实例
Nov 20 PHP
ThinkPHP里用U方法调用js文件实例
Jun 18 PHP
php实现html标签闭合检测与修复方法
Jul 09 PHP
在php中设置session用memcache来存储的方法总结
Jan 14 PHP
php使用curl并发减少后端访问时间的方法分析
May 12 PHP
Yii框架实现邮箱激活的方法【数字签名】
Oct 18 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
php双向队列实例讲解
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
解析在PHP中使用全局变量的几种方法
2013/06/24 PHP
php实现Linux服务器木马排查及加固功能
2014/12/29 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
AJAX的使用方法详解
2017/04/29 PHP
jquery 笔记 事件
2011/11/02 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
浅析2种JavaScript继承方式
2015/12/04 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
Vue原理剖析 实现双向绑定MVVM
2017/05/03 Javascript
基于node.js之调试器详解
2017/08/22 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
vue.js实现格式化时间并每秒更新显示功能示例
2018/07/07 Javascript
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
python实现计算倒数的方法
2015/07/11 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
java中两个byte数组实现合并的示例
2018/05/09 Python
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
解析Python的缩进规则的使用
2019/01/16 Python
python装饰器常见使用方法分析
2019/06/26 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
canvas进阶之如何画出平滑的曲线
2018/10/15 HTML / CSS
详解h5页面在不同ios设备上的问题总结
2019/03/01 HTML / CSS
亲子读书活动方案
2014/02/22 职场文书
三年级评语大全
2014/04/23 职场文书
师范类求职信
2014/06/21 职场文书
购房公证委托书(2014版)
2014/09/12 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
2015年教研工作总结
2015/05/23 职场文书
课程设计感想范文
2015/08/11 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技