位置: 编程技术 - 正文

详解PHP的Laravel框架中Eloquent对象关系映射使用(php ladp)

编辑:rootadmin

推荐整理分享详解PHP的Laravel框架中Eloquent对象关系映射使用(php ladp),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:laravel php,phpstudy laravel,php layui,php ladp,php ladp,php ladp,php laravel artisan,php laravel artisan,内容如对您有帮助,希望把文章链接给更多的朋友!

零、什么是 EloquentEloquent 是 Laravel 的 'ORM',即 'Object Relational Mapping',对象关系映射。ORM 的出现是为了帮我们把对数据库的操作变得更加地方便。

Eloquent 让一个 'Model类' 对应一张数据库表,并且在底层封装了很多 'function',可以让 Model 类非常方便地调用。来看一段如下代码:

'protected $fillable = [];' 这一行代码在这里没有任何价值,是 generator 自动生成的,在此我们不做讨论。

这个类简直再简单不过了,没有指定命名空间,没有构造函数,如果那一行没有意义的代码也不算上的话,这个文件就只有两个有实际意义的东西: 'Article' 和 'Eloquent'。没错,Eloquent 就是这么?耪ㄌ欤?恍枰?坛幸幌 Eloquent 类,就可以干 'first() find() where() orderBy()' 等非常非常多的事情,这就是面向对象的强大威力。

一、Eloquent 基本用法Eloquent 中文文档在: Eloquent 的几种常见用法的代码。

找到 id 为 2 的文章打印其标题

查找标题为“我是标题”的文章,并打印 id

查询出所有文章并循环打印出所有标题

查找 id 在 ~ 之间的所有文章并打印所有标题

查询出所有文章并循环打印出所有标题,按照 updated_at 倒序排序

基础使用要点1. 每一个继承了 Eloquent 的类都有两个 '固定用法' 'Article::find($number)' 'Article::all()',前者会得到一个带有数据库中取出来值的对象,后者会得到一个包含整个数据库的对象合集。

2. 所有的中间方法如 'where()' 'orderBy()' 等都能够同时支持 '静态' 和 '非静态链式' 两种方式调用,即 'Article::where()...' 和 'Article::....->where()'。

3. 所有的 '非固定用法' 的调用最后都需要一个操作来 '收尾',本片教程中有两个 '收尾操作':'->get()' 和 '->first()'。

二、中间操作流Builder 这个单词可以直译成构造器,但是“中间操作流”更容易理解,因为数据库操作大部分时候都是链式操作的。

中间操作流,请看代码:

这段代码的 `::where()->where()->orderBy()` 就是中间操作流。中间操作流用面向对象的方法来理解,可以总结成一句话:

创建一个对象,并不断修改它的属性,最后用一个操作来触发数据库操作。如何找到中间操作流的蛛丝马迹

中间操作流这个东西,文档里几乎没有任何有价值的信息,那么,我们该怎么找出这个玩意儿呢?很简单,使用以下代码:

然后你就会看到下面的错误:

为什么会出现错误?因为 `Article::where()` 了之后依然是 `Builder` 对象,还不是 `Article` 对象,不能直接取 `title`。

“终结者”方法

所谓 “终结者” 方法,指的是在 N 个中间操作流方法对某个 Eloquent 对象进行加工以后,触发最终的数据库查询操作,得到返回值。

`first()` `get()` `paginate()` `count()` `delete()` 是用的比较多的一些 “终结者” 方法,他们会在中间操作流的最后出现,把 SQL 打给数据库,得到返回数据,经过加工返回一个 Article 对象或者一群 Article 对象的集合。

复杂用法示例

三、模型间关系(关联)1.一对一关系

详解PHP的Laravel框架中Eloquent对象关系映射使用(php ladp)

顾名思义,这描述的是两个模型之间一对一的关系。这种关系是不需要中间表的。

假如我们有两个模型:User 和 Account,分别对应注册用户和消费者,他们是一对一的关系,那么如果我们要使用 Eloquent 提供的一对一关系方法,表结构应该是这样的:

假设我们需要在 User 模型中查询对应的 Account 表的信息,那么代码应该是这样的。 `/app/models/User.php`:

然后,当我们需要用到这种关系的时候,该如何使用呢?如下:

此时得到的 `$account` 即为 `Account` 类的一个实例。

这里最难的地方在于后面的两个 foreign_key 和 local_key 的设置,大家可以就此记住:在 User 类中,无论 hasOne 谁,第二个参数都是 `user_id`,第三个参数一般都是 `id`。由于前面的 `find()` 已经锁定了 id = ,所以这段函数对应的 SQL 为: `select * from account where user_id=`。

这段代码除了展示了一对一关系该如何使用之外,还传达了三点信息,也是我对于大家使用 Eloquent 时候的建议:

(1). 每一个 Model 中都指定表名

(2). has one account 这样的关系写成 `hasOneAccount()` 而不是简单的 `account()`

(3). 每次使用模型间关系的时候都写全参数,不要省略相应的,如果使用 belongsTo() 关系,应该这么写:

2.一对多关系

学会了前面使用一对一关系的基础方法,后面的几种关系就简单多了。

我们引入一个新的Model:Pay,付款记录。表结构应该是这样的:

User 和 Pay 具有一对多关系,换句话说就是一个 User 可以有多个 Pay,这样的话,只在 Pay 表中存在一个 `user_id` 字段即可。 `/app/models/User.php`:

然后,当我们需要用到这种关系的时候,该如何使用呢?如下:

此时得到的 `$accounts` 即为 `IlluminateDatabaseEloquentCollection` 类的一个实例。大家应该也已经注意到了,这里不是简单的 `-> hasOneAccount` 而是 `->hasManyPays()->get()`,为什么呢?因为这里是 `hasMany`,操作的是一个对象集合。

相应的 belongsTo() 的用法跟上面一对一关系一样:

3.多对多关系

多对多关系和之前的关系完全不一样,因为多对多关系可能出现很多冗余数据,用之前自带的表存不下了。

我们定义两个模型:Article 和 Tag,分别表示文章和标签,他们是多对多的关系。表结构应该是这样的:

在 Model 中使用:

需要注意的是,第三个参数是本类的 id,第四个参数是第一个参数那个类的 id。

使用跟 hasMany 一样:

这里会得到一个非常复杂的对象,可以自行 `var_dump()`。跟大家说一个诀窍,`var_dump()` 以后,用 Chrome 右键 “查看源代码”,就可以看到非常整齐的对象/数组展开了。

在这里给大家展示一个少见用法(奇技淫巧):

对,你没有看错,可以 belongsToMany 自己。其他关系

Eloquent 还提供 “远层一对多关联”、“多态关联” 和 “多态的多对多关联” 这另外三种用法,经过上面的学习,我们已经掌握了 Eloquent 模型间关系的基本概念和使用方法,剩下的几种不常用的方法就留到我们用到的时候再自己探索吧。

重要技巧:关系预载入你也许已经发现了,在一对一关系中,如果我们需要一次性查询出个 User 并带上对应的 Account 的话,那么就需要给数据库打 1 + 条 SQL,这样性能是很差的。我们可以使用一个重要的特性,关系预载入: SQL 就是这个样子的:

这样 1 + 条 SQL 就变成了 1 + 1 条,性能大增。

简单谈谈PHP中strlen 函数 strlen函数说明。intstrlen(string$string)在这篇文章,我们可以知道strlen函数是通过ZendEngine定义的。函数的定义可以在这里查看。在这里也给出函数的源码:Z

linux下为php添加iconv模块的方法 ./configure--with-mysql=/backup/mysql--with-freetype-dir--with-jpeg-dir--with-png-dir--with-zlib--with-curl--with-gd--enable-gd-native-ttf--with-apxs2=/usr/local/apache/bin/apxs--enable-sockets--with-

PHP Try-catch 语句使用技巧 PHPTry-catch语句为了进一步处理异常,我们需要使用try-catch语句----包括Try语句和至少一个的catch语句。任何调用可能抛出异常的方法的代码都应该使用try

标签: php ladp

本文链接地址:https://www.jiuchutong.com/biancheng/290348.html 转载请保留说明!

上一篇:PHP计算当前坐标3公里内4个角落的最大最小经纬度实例(php根据经纬度计算距离)

下一篇:简单谈谈PHP中strlen 函数(php中strstr)

  • 合伙企业税务筹划点
  • 税务会计账务处理
  • 从厂家拿货怎么谈价格
  • 工资出现负数怎么申报个税
  • 免税发票是增值税发票吗
  • 财产租赁合同印花税率多少
  • 预包装食品是否备案怎么查询
  • 开发票时怎么操作收款人 复核人 开票人
  • 分公司企业所得税汇总缴纳还是单独缴纳
  • 销售收入的暂估入账是否结转利润
  • 印花税减半征收优惠政策2022
  • 企业资金运动包括哪几个环节
  • 单位搬迁员工怎么办
  • 软件企业即征即退账务处理
  • 小规模纳税人费用票怎么做账
  • 行政单位专项资金核算方法
  • 公司破产后资产怎么处理
  • 年金计算个税需要扣除吗
  • 文化事业建设费的征收范围
  • 没有发票的固定资产可以税前扣除吗
  • 债务利息税前列支什么意思
  • 本月暂估入库,下月
  • 超出经营范围开发票
  • 固定资产报废清理账务处理
  • win11系统更新卡在25%
  • 不能升级win11的二手电脑值得购买吗
  • 财务软件的摊销额计入管理费用
  • bellzee.exe是什么
  • php get post
  • 摩洛哥首都拉巴特简介
  • phpcurl模拟登录
  • Bàu Cá Cái的红树林,越南广义 (© Robert Harding World Imagery/Offset)
  • 合伙企业的股息红利要交税吗
  • 收到债劵利息会减少吗
  • 分公司注销,总公司账务处理
  • 存货捐赠视同销售的会计分录怎么做?
  • python结合
  • js生成条形码的方式有哪些
  • node js教程
  • php能开发微信小程序吗
  • 小企业会计准则没有以前年度损益调整科目
  • python的多线程 吃cpu太厉害
  • 存货盘盈盘亏处理会计分录
  • sqlserver怎么用
  • 完税证明可以去税务局补打吗
  • CentOS 7下MySQL服务启动失败的快速解决方法
  • 委托加工物资实际成本包括增值税吗
  • 主营业务成本的增加在哪一方
  • 企业出租经营权是否征税
  • 合理损耗如何处理
  • 公司年底奖金怎么计算
  • 开票后收不回来款怎么办
  • 十二月份没出现问题
  • 非同一控制下企业合并,企业合并成本包括
  • 基本生产成本和生产成本
  • 固定资产折旧完了还算固定资产吗
  • 什么经营范围可以开推广服务费
  • 借方是收入还是支出损益类
  • 劳务派遣税率是多少2023
  • Mysql主从同步的实现原理
  • 快速切换用户是什么意思
  • window系统大全
  • window系统大全
  • centos6.5无法启动
  • linux sort命令参数及用法详解
  • Linux如何查看硬盘分区
  • linux操作系统配置网络
  • node js教程
  • Android Broadcast
  • unity网络通信插件
  • linux tar -zxf
  • unity ulua
  • jquery怎么写
  • javascript如何学
  • 国家税务总局河南省税务平台
  • 山东地域分布
  • 耕地占用税 湖北
  • 哪些情况要交房租
  • 购销合同印花税最新政策2023
  • 全国城管改革什么时候结束
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设