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 协议》,转载必须注明作者和本文链接
更多文章去我的博客 看看
本帖由系统于 4年前 自动加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 19

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

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

常规操作,常规操作😂

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

appends 这个确实不错

4年前 评论

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

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

基操,坐下,勿6

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

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

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

file

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

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

4年前 评论

这…难道不是常规操作?

3年前 评论

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

3年前 评论

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

3年前 评论

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 确实还没注意到。

3年前 评论

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

3年前 评论
zxdstyle (楼主) 3年前

append和query都很实用,大神啊

2年前 评论

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