如何使用laravel集合缓存和查找数据透视表中的第一个匹配项?

时间:2016-10-07 13:28:09

标签: php laravel collections eloquent laravel-5.3

我有这些表

  • 用户
  • 作用
  • user_roles

在user_roles表中有以下字段

  • 起始日期
  • END_DATE
  • IS_ACTIVE

如果当前用户将其置于缓存中一小时,我如何读取所有活动和未过期的角色?

在一个角色停用时是否有任何清理缓存?

1 个答案:

答案 0 :(得分:0)

关系定义不正确。这应该如下所示:

用户模型

class User {
    public function roles() {
        return $this->hasMany(App\Role::class);
    }
}

角色模型

class Role {
    public function users() {
        return $this->hasMany(App\User::class);
    }
}

现在创建适当的数据透视表来处理这种关系

role_user schema

Schema::create('role_user', function(Blueprint $table){
    $table->increments('id');

    $table->integer('role_id')->unsigned();
        $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');

    $table->integer('role_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');

    $table->timestamp('start_date');
    $table->timestamp('end_date');
    $table->integer('is_active')->default(0); //change to 1 if you want always to be active
});

现在修改我们的User课程,并将->withPivot('start_date', 'end_date', 'is_active');添加到我们的roles()关系中。

更新了用户模型

class User {
    public function roles() {
        return $this->hasMany('App\Role::class')->withPivot('start_date', 'end_date', 'is_active');
    }
}

但是等等,这不会让我的用户成为活跃的角色吗?!没问题,让我们用查询范围来做。

class User { 
    //...

    public function scopeOnlyActiveRoles ($query) {
        return $query->whereHas('roles', function($query){
            return $query->where('start_date', '>=', Carbon::now())
                         ->where('end_date', '<=', Carbon::now())
                         ->where('is_active', 1);
        });
    }
}