关于 Eloquent 的备忘。
HUGOMORE42
Scope-作用域
可以省掉每次写一堆 ORM where
可以全局或局部
模型中以 scope 开头的函数都可以当作是 Eloquent Scope 直接调用
全局作用域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class AgeScope implements Scope
{
/**
* 应用作用域
*
* @param \Illuminate\Database\Eloquent\Builder $builder
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public function apply(Builder $builder, Model $model)
{
return $builder->where('age', '>', 200);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
<?php
namespace App;
use App\Scopes\AgeScope;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 数据模型的启动方法
*
* @return void
*/
protected static function boot()
{
parent::boot();
static::addGlobalScope(new AgeScope);
}
}
|
局部作用域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class Role extends Model
{
public function scopePermissions(Builder $query, array $tag)
{
$permissions = Permission::whereIn('tag', $tag)->pluck('id')->toArray();
if (!$permissions) {
return;
}
return $query->whereRaw("json_contains(permissions, '[". implode(',', $permissions) ."]') > 0");
}
}
$roles = Role::permissions(['user.modify', 'order.remove'])->get();
|
访问器、修改器
改变模型原有的某些属性,让模型不再只是一个数据库映射。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
<?php
namespace App\Models;
use App\Models\User;
class User extends BaseModel
{
// 通过 $appends 属性要添加的模型属性, 类似于数据库中的虚拟列
protected $appends = ['type'];
public function getTypeAttribute()
{
$relations = config('xxx.type');
return $relations[$this->relation_type] ?? $this->relation_type;
return array_get($relations, $this->relation_type, $this->relation_type);
}
public function setCardAttribute($v)
{
$v = is_array($v) ? json_encode($v, JSON_UNESCAPED_UNICODE) : $v;
$this->attributes['card'] = $v;
}
}
|