Laravel ORM 中你不知道的骚操作

append

    class User extends Model
    {
        protected $appends = ['is_adult'];

        public function getIsAdultAttribute()
        {
            return $this->attribute['age'] > 18;
        }
    }

这个操作大家是不是都用过,在模型里新增一个数据库不存在的字段,非常方便。但是 $appends 是全局的,所有的查询中都会添加 is_adult 这个字段。

    User::select('id', 'name')->first();

像这样查询的时候甚至还会报错提示 age 字段不存在。

我们可以像这样,在查询的时候再将 is_adult 添加进查询结果集中。

    $user = User::first();

    $user->append('is_adult');

你以为这就完了么?不仅仅如此,如果我们查询的是多个用户怎么办,难道自己 for 循环 append 一遍么?不不不,我们优雅的 Laravel 已经为我们考虑过了。

    $user = User::paginate(10);

    $user->each->append('is_adult');

query

     User::where('sex', 'girl')->where('age', '<=', 20)->where('money', '>', 1000000000000)->get();

这种查询语句大家是不是经常写啊?有没有发现一个问题?本来找个富萝莉就挺难得,还没有提示。

Laravel ORM 中你不知道的骚操作

这怎么能忍,稍稍改写一下,在最前面加个 query ,轻轻松松娶富萝莉走上人生巅峰。

Laravel ORM 中你不知道的骚操作

where

富萝莉没找到的话,降低点要求正儿八经找个女朋友吧。虽然有点难,但是如果你知道她的 ID,就可以直接使用

    User::query()->find(2);

找到她,简单快捷。那要是不知道 ID 只知道名字的情况下咋整呢?写where条件?告诉你个更快捷的方法,毕竟找女朋友不能等。

    User::query()->firstWhere(['name' => '乔碧萝']);

先写这么多,发现其他骚操作再更:smirk:

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

User::whereName('wang')->get() where+字段名的操作也比较骚

5个月前 评论
zxdstyle (楼主) 5个月前
yangjisen 5个月前
zxdstyle (楼主) 5个月前
xcy 5个月前
Epona 5个月前
skarner 5个月前
kangfq (作者) 5个月前
Epona

常规操作,常规操作😂

5个月前 评论
zxdstyle (楼主) 5个月前
Epona (作者) 5个月前
lufeijun1234

appends 这个确实不错

5个月前 评论

append很实用,以前都是老实循环append

5个月前 评论
自由与温暖是遥不可及的梦想

基操,坐下,勿6

5个月前 评论
zxdstyle (楼主) 5个月前
自由与温暖是遥不可及的梦想 (作者) 5个月前
小宝爹 4个月前

不够骚,希望整点更骚的来 :grin:

5个月前 评论
  • 楼主总结的不错。
  • 不过有个小错误需要纠正下,单独这样写,其实不会报错。 :smile:

file

  • 想报错的话,要这么写:
      User::select('id', 'name')->first()->toArray()
      //除非在控制器里面 return 了,因为在控制器 return,laravel 会去调用 Model->toJson,然后 toJson 调用 toArray,引起报错
      return User::select('id', 'name')->first();
5个月前 评论
zxdstyle (楼主) 5个月前

细看 6.* 文档, 或者直接搜索 append ,没有什么是文档没有的;如果有那是你找的不对;或则直接 去看 英文的API 文档

5个月前 评论

奇巧淫技 :sweat_smile:

4个月前 评论

这…难道不是常规操作?

4个月前 评论

file 下次试试setAppends(['is_adult]);

4个月前 评论

laravel5.7 不用调用 appendeach,自动为每个模型追加了。

4个月前 评论

laravel这些搞太多了 感觉一直用它的奇巧淫技会被行为绑架 :joy: data_get()这玩意儿可以调用方法 :confused:

3个月前 评论

对于append这个问题,我是做了一个package来解决的 github.com/terranc/laravel-eloquen...

use Lookfeel\AppendAutomate\Database\Eloquent\Model;

class User extend Modal {
    protected $appends = [
        'first_letter',
        'firstname|lastname' => 'fullname',     // firstname 和 lastname 字段缺一不可,否则不返回 fullname
        'gender' => 'gender_text',  // gender 是一个 int 字段,0:女,1:男
        'status' => 'status_text', // status 是一个 int 字段,0:禁用,1:启用
        'gender_text' => 'access',
        'access' => 'access_text',
    ];
    public function getFirstLetterAttribute()
    {
        return substr($this->firstname, 0, 1);
    }
    public function getFullnameAttribute()
    {
        return $this->firstname . ' ' . $this->lastname;
    }
    public function getGenderTextAttribute()
    {
        return ['女', '男'][$this->gender];
    }
    public function getStatusTextAttribute()
    {
        return ['启用', '禁用'][$this->status];
    }
    public function getAccessAttribute()
    {
        return $this->gender_text === 'Female';
    }
    public function getAccessTextAttribute()
    {
        return $this->access ? 'can' : 'Can not';
    }
}
User::select(['id', 'firstname', 'gender'])->firstOrFail();

/***
{
    "id": 1,
    "first_letter": "T",
    "firstname": "Terran",
    "gender": 1,
    "gender_text": "男",
    "access": 1,
    "access_text": "can"
}
*/
3个月前 评论

不错,appends 确实还没注意到。

2个月前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!