ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
1.数据在存入数据库的时候需要进行预先处理,比如考虑一个简单地例子:我们在保存用户的登录密码的时候,都是需要将密码用某种方式加密过后在写入数据库的,我们难道在每一次在提交表单过来之后都对传过来的数据进行一次数据加密么?能不能有一种自动完成对密码入库前就加密的机制呢?这样我们在处理表单的时候就不用关心密码加密的问题了 2.想一想我们在向用户展示的数据是不是基本上都是从数据库取的呢?那么往往我们会有很多的查询语句,在这样的情况之下很多的查询语句可以就会重复,但是在写代码这一行中,一旦出现多个重复,基本上就会有优化方式存在,所以这个时候queryScope就派上用场了 在控制器中写 ~~~ public function index(Request $request) { $input=$request->all(); Article::create($input); //这样写判断文章发布时间就太臃肿了 // $articles=Article::latest()->where('published_at','<=',Carbon::now())->get(); //我们这样写 $articles=Article::latest()->published()->get(); echo '<pre>'; var_dump($articles->toArray()); return view('articles/show'); } ~~~ 在模型中写 ~~~ namespace App; use Illuminate\Database\Eloquent\Model; use Carbon\Carbon; class Article extends Model { protected $fillable=['name','published_at']; // set关键字 那个字段 Attribute关键字 // 意思就是将数据保存到数据库之前对数据进行预处理 public function setPublishedAtAttribute($date) { //use Carbon\Carbon; $this->attributes['published_at']=Carbon::createFromFormat('Y-m-d',$date); } //scope关键字开始后面跟方法名字 (Builder $query) public function scopePublished($query) { $query->where('published_at','<=',Carbon::now()); } } ~~~ setxxAttribute 在设置(sql: insert update) 的时候 会将$obj->xx = 'value'的时候, 操作数据库之前 自动转化一下 getxxAttribute 在获取xx属性的时候  $obj->xx 会转化 示例: ~~~ //获取之前首字母大写 public function getFirstNameAttribute($value) { return ucfirst($value); } //存入之前的改变 public function setFirstNameAttribute($value) { $this->attributes['first_name'] = strtolower($value); } ~~~ 如果是这样的话,是能取到没被get修改器修改的 ~~~ $res = User::find(20)->getAttributes(); dump($res); ~~~ 更多参见:https://www.laravist.com/blog/post/programming-with-laravel-5-queryscope-and-set-attribute