前段时间比较忙,就没有坚持写博客,但发现这周末再想捡起来,好难,一直到了今天晚上,才决定坐下来写一篇,哈哈哈~~

最近在用 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的坑的更多相关文章

  1. 后端PHP框架laravel学习踩的各种坑

    安装完laravel的ventor目录后出现“Whoops, looks like something went wrong.”这样的错误信息 打开config/app.php,打开debug为tru ...

  2. Laravel学习笔记(三)--在CentOS上配置Laravel

    在Laravel框架上开发了几天,不得不说,确实比较优雅,处理问题逻辑比较清楚.     今天打算在CentOS 7上配置一个Laravel,之前都是在本机上开发,打算实际配置一下.     1)系统 ...

  3. Laravel学习笔记之Session源码解析(上)

    说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助.Laravel在web middleware中定义了 ...

  4. 《PHP框架Laravel学习》系列分享专栏

    <PHP框架Laravel学习>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201735.html 文章 Laravel教程:l ...

  5. Laravel 学习 .env文件 getenv 获得环境变量的值

    Laravel 学习 .env文件 getenv 获得环境变量的值  我们还需要对应用的 .env 文件进行设置,为应用指定数据库名称 sample. .env . . . DB_DATABASE=s ...

  6. laravel学习之旅

    前言:之前写了二篇YII2.0的基本mvc操作,所以,打算laravel也来这一下 *安装现在一般都用composer安装,这里就不讲述了* 一.熟悉laravel (1)如果看到下面这个页面,就说明 ...

  7. laravel学习:主从读写分离配置的实现

    本篇文章给大家带来的内容是关于laravel学习:主从读写分离配置的实现,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在DB的连接工厂中找到以下代码.../vendor/larav ...

  8. Laravel学习笔记之PHP反射(Reflection) (上)

    Laravel学习笔记之PHP反射(Reflection) (上) laravel php reflect 2.1k 次阅读  ·  读完需要 80 分钟 3 说明:Laravel中经常使用PHP的反 ...

  9. Laravel chunk和chunkById的坑

    Laravel chunk和chunkById的坑 公司中的项目在逐渐的向Laravel框架进行迁移.在编写定时任务脚本的时候,用到了chunk和chunkById的API,记录一下踩到的坑. 一.前 ...

随机推荐

  1. 移动先行之谁主沉浮? 带着你的Net飞奔吧!

    移动系源码:https://github.com/dunitian/Windows10 移动系文档:https://github.com/dunitian/LoTDotNet/tree/master/ ...

  2. 自定义Inspector检视面板

    Unity中的Inspector面板可以显示的属性包括以下两类:(1)C#以及Unity提供的基础类型:(2)自定义类型,并使用[System.Serializable]关键字序列化,比如: [Sys ...

  3. [APUE]标准IO库(上)

    一.流和FILE对象 系统IO都是针对文件描述符,当打开一个文件时,即返回一个文件描述符,然后用该文件描述符来进行下面的操作,而对于标准IO库,它们的操作则是围绕流(stream)进行的. 当打开一个 ...

  4. 【开源毕设】一款精美的家校互动APP分享——爱吖校推 [你关注的,我们才推](持续开源更新3)附高效动态压缩Bitmap

    一.写在前面 爱吖校推如同它的名字一样,是一款校园类信息推送交流平台,这么多的家校互动类软件,你选择了我,这是我的幸运.从第一次在博客园上写博客到现在,我一次一次地提高博文的质量和代码的可读性,都是为 ...

  5. C# 生成验证码图片时消除锯齿

    引言 基于生成图片实现了一个手机号转图片的需求. 内容也很简单,直接用手机号生成一个png图片.就是为了背景透明以便其他地方调用. 有无锯齿主要依靠一句代码:g.TextRenderingHint= ...

  6. thinkphp数据的查询和截取

    public function NewsList(){ $this->assign('title','news'); $p = I('page',1); $listRows = 6; $News ...

  7. Win10提示没有权限使用网络资源问题解决

    借鉴链接:http://www.cr173.com/html/67361_1.html Win10提示没有权限使用网络资源解决方法 1.打开控制面板; 2.在所有控制面板项中找到凭据管理器; 3.添加 ...

  8. 使用win10远程控制ubuntu16.04

    使用win10远程控制ubuntu16.04,网上很多需要安装xfce桌面的.今天介绍一下,不需要安装其他桌面,使用Ubuntu16.04自带桌面,漂亮美观. Ubuntu16.04端: 1.打开终端 ...

  9. Storm介绍(一)

    作者:Jack47 PS:如果喜欢我写的文章,欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 内容简介 本文是Storm系列之一,介绍了Storm的起源,Storm ...

  10. Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍

    摘要 : 本章节介绍NetExt常用的命令. 并且对SOS进行一些对比. NetExt的帮助 要想玩好NetExt, 入门就得看帮助. 看NetExt的帮助可以调用!whelp 命令. 这样hi列举出 ...