我们都知道通过Laravel中数据库查询出来的模型对象都是基于数据库字段,今天给大家展示一个 Laravel Eloquent ORM 模型特性-附加值不存在于数据表中。

举个简单的栗子,一篇文章(posts表)对应有很多评论(comments表),我们获取文章的同时需要获取评论数量。通常的做法就是根据 ORM 的关联关系,获取评论数量:$post->comments()->count() 。

如果获取的是一个文章列表,那么最直接的办法就是 froeach 查询出来的文章,然后每篇文章获取评论数量;另外一种做法就是用 with 然后在闭包里面实现评论数量,至于怎么实现,我就不详细介绍了。Laravel 提供了一种更优雅的方式。

关联关系

 class Post extends Model
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['title', 'text']; /**
* 文章对应多条评论
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function comments()
{
return $this->hasMany(Comment::class);
}
}

上面代码没有什么特殊的,只是先声明一下关联关系,接下来会使用。接下来创建一个访问器,如果你还不清楚访问器是什么,建议你看一下Laravel官方文档:https://laravel.com/docs/5.3/eloquent-mutators

创建访问器

 public function getCountCommentsAttribute()
{
return $this->comments()->count();
}

这里的 getCountCommentsAttribute 方法名中 get 和 Attribute 是固定写法,真正在模型中的名称是由 CountComments 决定,命名一般是驼峰写法,一个单词时在 ORM 模型中就是那个单词的小写,如果像 CountComments 这种方式在 ORM 模型会转化为 count_comments

创建访问器后,我们获取数据的时候 ORM 模型中并没有这个属性,因为Laravel并不会默认加上访问器的属性。

添加属性到ORM模型中

我们现在要做的很简单,我们想要在 ORM模型中获取到 count_comments 。只用简单的在 $appends 数组中添加属性名。

protected $appends = ['count_comments'];

OK,That was all!

简单的测试截图:

查询出来的ORM中可以看到 appends 里面添加了 count_comments 属性。把这个 ORM 模型进行 toArray() 的时候机构就更加清晰了:

更多用法和扩展根据大家需要来就行了,这里只做一个抛砖引玉。这个知识点看到国外文章,需要翻墙,我就不贴出来了。


转载自: http://blog.iwanli.me/article/zg36G9Yd.html

Eloquent ORM模型中添加自定义值的更多相关文章

  1. Laravel 数据库操作之Eloquent ORM模型

    //模型中的相关代码 namespace App; use Illuminate\Database\Eloquent\Model; class Student extends Model{ //默认对 ...

  2. osg 在fbx模型中添加自定义节点

  3. SQLAlchemy01 /SQLAlchemy去连接数据库、ORM介绍、将ORM模型映射到数据库中

    SQLAlchemy01 /SQLAlchemy去连接数据库.ORM介绍.将ORM模型映射到数据库中 目录 SQLAlchemy01 /SQLAlchemy去连接数据库.ORM介绍.将ORM模型映射到 ...

  4. SQLAlchemy(一):SQLAlchemy去连接数据库、ORM介绍、将ORM模型映射到数据库中

    SQLAlchemy01 /SQLAlchemy去连接数据库.ORM介绍.将ORM模型映射到数据库中 目录 SQLAlchemy01 /SQLAlchemy去连接数据库.ORM介绍.将ORM模型映射到 ...

  5. Eloquent ORM笔记

    基本操作 新增 $user = new User; $user->name = 'John'; $user->save(); $insertedId = $user->id;//从对 ...

  6. [Laravel] 03 - DB facade, Query builder & Eloquent ORM

    连接数据库 一.Outline 三种操作数据库的方式. 二.Facade(外观)模式 Ref: 解读Laravel,看PHP如何实现Facade? Facade本质上是一个“把工作推给别人做的”的类. ...

  7. Python的自定义属性访问跟描述器以及ORM模型的简单介绍

    一 . 自定义属性访问 1.__getattr__ 作用:当我们访问属性的时候,如果属性不存在(出现AttrError),该方法会被触发. 2.__getattribute__ 作用:访问属性的时候, ...

  8. 三十:数据库之定义ORM模型,并映射到数据库

    连接数据库操作 sqlalchemy映射步骤: 1.创建ORM模型,这个模型必须继承sqlalchemy提供的基类2.在这个ORM模型中创建一些属性,与表中的字段一一映射,这些属性必须是sqlalch ...

  9. laravel Eloquent ORM联合查询出现Class not found,就算在Moel中存在这个类

    今天发现一个坑,在处理Eloquent ORM的联合查询时,一直报错Class 'AdminGroup' not found ,可是我的项目中明明存在这个类,如下 这是我的模型类: 它们的控制器方法: ...

随机推荐

  1. 【转】Android ImageView圆形头像

    Android ImageView圆形头像 图片完全解析 我们在做项目的时候会用到圆形的图片,比如用户头像,类似QQ.用户在用QQ更换头像的时候,上传的图片都是矩形的,但显示的时候确是圆形的. 原理: ...

  2. hdu 5884 Sort 队列+多叉哈夫曼树

    Sort Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Des ...

  3. Intel微处理结构.docx

    1. 段寄存器 CS(代码段),代码段是一个存储器区域,这里保存微处理器使用的代码(程序和过程).代码段寄存器定义了存放代码的存储器段的起始地址.在实模式下工作时,它定义一个64KB存储器段的起始地址 ...

  4. 如何破解mssql for linux 3.5G内存的限制

    在上有篇博客中主要介绍了如何在CentOS 中安装和配置mssql ,在安装过程中遇到3.5G内存的限制,下面介绍如何去破解, 微软发布了SQLServer for Linux,但是安装竟然需要3.5 ...

  5. Q&A:string、vector、iterator、bitset

    细节要点 getline(cin,string)与cin>>string 在VS2013中通过输入换行符\n,对getline以及cin的用法进行测试,但是并没有像文中所述遇到换行符停止读 ...

  6. 配置web项目出的各种error (安装sql2008错误,网站连接数据库error错误等等)

      一个破error:40 错误搞出了很多莫名其妙的为问题,搞了5天,最后重装系统加上重新配置终于好了. 1. 关于SQL 2008 安装错误 安装之前必须安装VS2008 SP1 安装到最后提示 试 ...

  7. 1D/1D优化dp之利用决策点的凸性优化

    关于dp的优化之前做过一些简单的利用优先队列或者单调队列维护一个值就ok了,但有时候给出的方程很难直接用单调队列维护,需要转化一下思路. 这种优化方式利用数形结合,根据比较斜率来抛去一些非最优解,能将 ...

  8. 21 Python 异常处理

    异常和错误                                                      AttributeError 试图访问一个对象没有的树形,比如foo.x,但是fo ...

  9. Shell check IP

    #! /bin/bash checkip() {        if echo $1 |egrep -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3 ...

  10. 数据库迁移到Azure SQL Database用户无法登陆的问题

    业务情景:数据库是运维迁移上去的,好像使用了一个工具叫做Microsoft Data Migration Assistant,迁移之后,我的web应用无法连接数据库. 迁移之后的数据库内有User,但 ...