Laravel学习--关于Relation的坑
前段时间比较忙,就没有坚持写博客,但发现这周末再想捡起来,好难,一直到了今天晚上,才决定坐下来写一篇,哈哈哈~~
最近在用 Laravel 5.2,踩了几个关于 Relation 的坑,在这里用博客记录一下。
如果大家不了解 Laravel 的 Relation 的话,可以查看文档Eloquent: Relationships。
在数据库中先创建两张表 users 和 password_resets,分别代表用户和重置密码,假设他们的关系是一对多,一个用户有多个重置密码记录。
我们可以使用 Laravel 提供的 migration 创建数据库,具体可以查看文档Database: Migrations。
使用的users 表和 password_resets 表是默认创建的。
然后我们可以通过界面注册一个用户,也可以在 users 表中直接插入一条。password_resets 表中也插入几条数据,这个也可以通过界面的忘记密码添加。
然后创建好相应的Model,在 User.php 中,加入如下代码:
public function passwordReset() {
return $this->hasMany('App\PasswordReset', 'email', 'email');
}
在 Controller 中使用如下代码:
$data = User::with('passwordReset')->get();
echo $data->toJson();
die;
这个时候你可以看到输出的数据中的 password_reset 字段是有内容的,但假如说你希望查找的 password_reset 中只有 token,写法如下:
$data = User::with(['passwordReset' => function($query) {
$query->select('token');
}])->get();
然后你会惊奇的发现输出的数据中的 password_reset 字段是一个空数组。
是不是觉得好神奇,当时我也是崩溃的,去查看源码,发现原来,Relation 是通过两条语句实现的,它会先查主表(users表),选出其中关联的字段(email字段)组成数组,使用 in 语句去查询关联表(password_resets表),然后将查出来的数据根据关联字段相等,处理到一起。这里需要注意的是查出来的两块数据关联到一起是在 php 中实现的,所以,上面的语句由于没有查出 password_resets表的 email 字段,无法关联到一起,其结果的 password_reset 字段是一个默认值-空数组。
现在我们在 select 中加入 email 字段,代码如下:
$data = User::with(['passwordReset' => function($query) {
$query->select('token', 'email');
}])->get();
然后你就会发现数据中的 password_reset 字段有值了。
这是踩到的一个坑。
然后我们在来设置一下 PasswordReset.php 中设置一下主键,设置为 email 字段(这里可能不太合理,email 会重复,这样写只是为了重现这个坑),代码如下:
protected $primaryKey = 'email';
然后你又会惊奇的发现输出的数据中的 password_reset 字段又变成了一个空数组,这又是怎么了?
原来 Laravel 5.2 为 Model 添加了一个属性 $keyType,默认值是 int,这意味着它会将查出来的 email 字段强转成 int 类型,所以在匹配的时候,就有对不上了。
现在我们只需要在定义一下 $keyType 为 string 就可以了,在 PasswordReset.php 中添加如下代码:
protected $keyType = 'string';
这是在 Laravel 5.0 升 5.2时踩到的坑。
Laravel 5.2,我也是刚开始看,如果上面有什么不对的,欢迎大家指出~~
如果大家觉得这篇博客对你有所帮助的话,请点一下顶~~
Laravel学习--关于Relation的坑的更多相关文章
- 后端PHP框架laravel学习踩的各种坑
安装完laravel的ventor目录后出现“Whoops, looks like something went wrong.”这样的错误信息 打开config/app.php,打开debug为tru ...
- Laravel学习笔记(三)--在CentOS上配置Laravel
在Laravel框架上开发了几天,不得不说,确实比较优雅,处理问题逻辑比较清楚. 今天打算在CentOS 7上配置一个Laravel,之前都是在本机上开发,打算实际配置一下. 1)系统 ...
- Laravel学习笔记之Session源码解析(上)
说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助.Laravel在web middleware中定义了 ...
- 《PHP框架Laravel学习》系列分享专栏
<PHP框架Laravel学习>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201735.html 文章 Laravel教程:l ...
- Laravel 学习 .env文件 getenv 获得环境变量的值
Laravel 学习 .env文件 getenv 获得环境变量的值 我们还需要对应用的 .env 文件进行设置,为应用指定数据库名称 sample. .env . . . DB_DATABASE=s ...
- laravel学习之旅
前言:之前写了二篇YII2.0的基本mvc操作,所以,打算laravel也来这一下 *安装现在一般都用composer安装,这里就不讲述了* 一.熟悉laravel (1)如果看到下面这个页面,就说明 ...
- laravel学习:主从读写分离配置的实现
本篇文章给大家带来的内容是关于laravel学习:主从读写分离配置的实现,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在DB的连接工厂中找到以下代码.../vendor/larav ...
- Laravel学习笔记之PHP反射(Reflection) (上)
Laravel学习笔记之PHP反射(Reflection) (上) laravel php reflect 2.1k 次阅读 · 读完需要 80 分钟 3 说明:Laravel中经常使用PHP的反 ...
- Laravel chunk和chunkById的坑
Laravel chunk和chunkById的坑 公司中的项目在逐渐的向Laravel框架进行迁移.在编写定时任务脚本的时候,用到了chunk和chunkById的API,记录一下踩到的坑. 一.前 ...
随机推荐
- 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
- iOS开发系列--打造自己的“美图秀秀”
--绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...
- [NodeJS] 优缺点及适用场景讨论
概述: NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”,那么它的出现是为了解决什么问题呢,它有什么优缺点以及它适用于什么场景呢? 本文就个人使用经验对这些问题进行探讨. 一. ...
- 标准产品+定制开发:专注打造企业OA、智慧政务云平台——山东森普软件,交付率最高的技术型软件公司
一.公司简介山东森普信息技术有限公司(以下简称森普软件)是一家专门致力于移动互联网产品.企业管理软件定制开发的技术型企业.公司总部设在全国五大软件园之一的济南齐鲁软件园.森普SimPro是由Simpl ...
- 展望未来:使用 PostCSS 和 cssnext 书写 CSS
原文链接:A look into writing future CSS with PostCSS and cssnext 译者:nzbin 像twitter,google,bbc使用的一样,我打算看一 ...
- node.js学习(二)--Node.js控制台(REPL)&&Node.js的基础和语法
1.1.2 Node.js控制台(REPL) Node.js也有自己的虚拟的运行环境:REPL. 我们可以使用它来执行任何的Node.js或者javascript代码.还可以引入模块和使用文件系统. ...
- MFC单文档程序添加HTML帮助支持
1.在App类 构造函数中添加 EnableHtmlHelp(); 2.在Frame类中,添加消息影射: ON_COMMAND(ID_HELP_FINDER, CFrameWnd::OnHelpFin ...
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- 使用EntityFramework6连接MySql数据库(code first方式)
demo托管地址:http://git.oschina.net/uustudy/ASP.NET-CodeFirst-MySQL-Demo.git 之前的是db first(地址:http://www. ...
- .Net程序在linux mono环境和WindowsServer上执行测试对比
最近研究了一下mono,想把windows上写的.Net程序移植到linux上跑.网上有资料说Linux上mono执行.Net程序效率比Windows高,本着实证的态度,只有实际验证过才有说服力. 写 ...