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年前 自动加精
Image
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 19

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

5年前 评论
Image zxdstyle (楼主) 5年前
Image 小学毕业生 5年前
Image zxdstyle (楼主) 5年前
Image 邢闯洋 5年前
Image Epona 5年前
Image skarner 5年前
Image kangfq (作者) 5年前
Image ShengDu-Linux 5年前
Epona

常规操作,常规操作😂

5年前 评论
Image zxdstyle (楼主) 5年前
Image Epona (作者) 5年前
lufeijun1234

appends 这个确实不错

5年前 评论

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

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

基操,坐下,勿6

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

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

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

file

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

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

5年前 评论

这…难道不是常规操作?

5年前 评论

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

5年前 评论

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

5年前 评论

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

5年前 评论

对于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"
}
*/
5年前 评论

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

5年前 评论

$user = User::paginate(10); $user->each->append('is_adult'); 我这样写 会报未定义属性:Illuminate\Pagination\LengthAwarePaginator::$each

5年前 评论
Image zxdstyle (楼主) 5年前

append和query都很实用,大神啊

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!