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模板页面中分页代码的解析
Feb 06 PHP
PHP 操作文件的一些FAQ总结
Feb 12 PHP
深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
Jun 06 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
Apr 05 PHP
php单一接口的实现方法
Jun 20 PHP
PHP对象链式操作实现原理分析
Oct 09 PHP
PHP中递归的实现实例详解
Nov 14 PHP
PhpStorm配置Xdebug调试的方法步骤
Feb 02 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
Apr 30 PHP
Yii框架页面渲染操作实例详解
Jul 19 PHP
laravel 解决crontab不执行的问题
Oct 22 PHP
PHP生成图表pChart的示例解析
Jul 31 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中的extract的作用分析
2008/04/09 PHP
通过PHP修改Linux或Unix口令的方法分享
2012/01/30 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
解决在Laravel 中处理OPTIONS请求的问题
2019/10/11 PHP
如何实现动态删除javascript函数
2007/05/27 Javascript
javascript模拟枚举的简单实例
2014/03/06 Javascript
javascript闭包入门示例
2014/04/30 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
JavaScript中0和""比较引发的问题
2016/05/26 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
vue2的todolist入门小项目的详细解析
2017/05/11 Javascript
react 实现页面代码分割、按需加载的方法
2018/04/03 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
2018/12/03 Javascript
vue 内联样式style中的background用法说明
2020/08/05 Javascript
用js实现放大镜效果
2020/10/28 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
js实现简单图片拖拽效果
2021/02/22 Javascript
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
在Django的视图中使用form对象的方法
2015/07/18 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
python中文件变化监控示例(watchdog)
2017/10/16 Python
Python paramiko模块的使用示例
2018/04/11 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
2020/06/28 Python
CSS3 实现雷达扫描图的示例代码
2020/09/21 HTML / CSS
Kiwi.com中国:找到特价机票并发现新目的地
2019/10/27 全球购物
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
语文教学感言
2014/02/06 职场文书
关于环保的建议书400字
2014/03/12 职场文书
环境日宣传活动总结
2014/07/09 职场文书
放弃遗产继承公证书
2015/01/26 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
大学新生入学感想
2015/08/07 职场文书
企业廉洁教育心得体会
2016/01/20 职场文书
详解Python中__new__方法的作用
2022/03/31 Python
Linux磁盘管理方法介绍
2022/06/01 Servers