关于 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;
    }
}