博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel学习--关于Relation的坑
阅读量:7011 次
发布时间:2019-06-28

本文共 1733 字,大约阅读时间需要 5 分钟。

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

最近在用 Laravel 5.2,踩了几个关于 Relation 的坑,在这里用博客记录一下。

如果大家不了解 Laravel 的 Relation 的话,可以查看文档。

在数据库中先创建两张表 users 和 password_resets,分别代表用户和重置密码,假设他们的关系是一对多,一个用户有多个重置密码记录。

我们可以使用 Laravel 提供的 migration 创建数据库,具体可以查看文档。

使用的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,我也是刚开始看,如果上面有什么不对的,欢迎大家指出~~

如果大家觉得这篇博客对你有所帮助的话,请点一下顶~~

转载地址:http://zrttl.baihongyu.com/

你可能感兴趣的文章
[Node.js] Add Logging to a Node.js Application using Winston
查看>>
qt-solutions提供了8个开源项目
查看>>
处理:“ORA-00257: archiver error. Connect internal only, until freed”的错误问题
查看>>
java 取汉字首字母
查看>>
苹果版小黄车(ofo)app主页菜单效果
查看>>
使用Genymotion模拟器或者手机运行ionic4程序
查看>>
Hadoop之父Doug Cutting
查看>>
关于socket阻塞与非阻塞情况下的recv、send、read、write返回值---部分内容可能不确切,待讨论...
查看>>
Matlab随笔之插值与拟合(上)
查看>>
Socket 通信(基础原理、实时聊天系统雏形)
查看>>
理解和使用WPF 验证机制
查看>>
tensorflow 在加载大型的embedding模型参数时,会遇到cannot be larger than 2GB
查看>>
Flutter的教程:ListView
查看>>
xxl-job安装教程
查看>>
SpringBoot(十八)@value、@Import、@ImportResource、@PropertySource
查看>>
[dubbo] Dubbo API 笔记——配置参考
查看>>
The last access date is not changed even after reading the file on Windows 7
查看>>
SQL Server 字符串处理函数
查看>>
恢复系统管理员密码的五大奇招
查看>>
英语形容“漂亮女孩”知多少
查看>>