你可能不知道的 Laravel Eloquent 操作

你可能不知道的 Laravel Eloquent 骚操作

从它的眼睛,我什么都没看到

Laravel Eloquent 提供了太多现成的方法,但是官方文档上有些东西是看不到的,这就需要日常开发的积累,源码的查看,以及相互之间的分享。

今天主要分享一下我知道的可能你不知道的而且文档没有的 Eloquent 中的几个操作。

push

大概率会碰到的。假设现在用户模型 User 和 微信 Wechat 是一对一关系,然后进行以下操作:

$user = User::where('name', 'wuqinqiang')->first();
$user->age = 18;
$user->wechat->nickName = "Remember";
$user->save()

那么此时,会保存用户信息,但是并不会保存对应 Wechat 的关联信息,想让它一起保存咋么办?也很简单。把 save 换成 push 即可。

$user->push();

我不想要模型事件

我们都知道,在使用 Eloquent 模型的时候,创建或者更新模型这些操作的时候,是有几个阶段的事件的,有时候可能因为业务上的需要,可能会监听某个事件执行某些操作。比如下面这段监听对应事件执行对应操作的代码:

    public static function boot()
    {
        parent::boot();
        static::creating(function ($model) {
           //业务逻辑
        });
    }

那要是不想在操作时触发任何事件则么办?你可以执行一个回调函数而无需触发任何事件:

$user = User::withoutEvents(function () {
return //保存或者更新代码
});

模型是否被动过手脚

想知道从数据库查询获取出来的模型是否被动过手脚(修改)?也有办法。可以使用 isDirty

$ user = User :: where('name','wuqinqiang')->first();
$ user-> isDirty(); // 还没被动过 返回 false
$ user-> name ='curry';  
$ user-> isDirty(); //模型被动过了 返回true 
$ user-> isDirty('email'); // 可以传入参数  验证某个参数是否被动过,这个我还没碰过 当然 false
$ user-> isDirty('name'); // true 

如果你还想具体了解到哪些是被动过了,可以使用:

$user->getDirty();  你将得到一个数组 ["name" => "curry"]

我想看原始数据

既然上面提到是否被动过手脚,那动过手脚之后我又想看看之前的模样(ps:人就是这样麻烦)。强大的 Laravel Eloquent 也可以办到:

$ user = User :: where('name','wuqinqiang')->first();
$user->name = 'curry';
$user->getOriginal(); // 返回数组 "name" => "wuqinqiang"
$user->getOriginal('name'); //指定要看哪个属性的原值  "wuqinqiang"

顺便分享一下你们知道的我不知道的文档上没有的骚操作??

本作品采用《CC 协议》,转载必须注明作者和本文链接
吴亲库里
本帖由系统于 4年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 19
yybawang

我也有一个,在使用 firstOrCreate 或 updateOrCreate 之后,如果想知道是否是 create 的数据,常用于自动注册操作,只在第一次插入时执行派发积分等事件

$User = User::firstOrCreate(['name' => 'test'], ['email' => 'test@test.com']);
if($User->wasRecentlyCreated){
    // true 则是 create 的数据,赠送积分
}
4年前 评论
playmaker 3年前

看到push,虎躯一震,好文章!到我收藏夹里吃灰去吧~ :joy: :joy:

4年前 评论
curry丶 4年前

学习咯 :+1:

4年前 评论
张浩浩浩浩

官方解释的 push 递归保存模型和关联数据 没有作者解释的明白。赞

3年前 评论

push 是真香

4年前 评论

$user->push(); 这个操作很骚

4年前 评论

getOriginal() 这个函数就这么diao?我正好有业务需要,但我的做法是创建一个历史记录表,比这个函数麻烦不知道多少倍

4年前 评论
PhoenixIcy 4年前

getOriginal我只知道可以获取访问器修改前的原始值,原来还能这么用

4年前 评论

push骚啊 :cow: :beer:

4年前 评论
panda-sir

:joy: push 确实是骚 我一般都是$user->wechant->save()

4年前 评论
小民爱Laravel

这个 push 吊!!!

4年前 评论

可以写到Wiki板块里面哟!

4年前 评论
wanghan

全部触及到了我的知识盲区!赞赞赞!

4年前 评论

$where [] = [function() {}];

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
46
粉丝
117
喜欢
493
收藏
604
排名:177
访问:5.5 万
私信
所有博文
社区赞助商