我正在创建一个学校平台,学生,教师......可以使用他们的凭据登录。为了减少重复数据,我没有创建一个名为students的单独表,而是将所有数据保存在users表中。
要知道用户是否是学生我有一个名为注册的表,在此表中存储了user_id
,schoolyear_id
和class_id
。
我已经制作了一个引用用户表的学生模型,但是如何确保该模型仅通过学生?
Student.php:
<?php
namespace App;
class Student extends User
{
protected $table= 'users';
public function enrollments(){
return $this->belongsToMany(Enrollment::class);
}
}
user.php的:
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;
use Illuminate\Support\Facades\Auth;
class User extends Authenticatable
{
use Notifiable;
use HasRoles;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'first_name','last_name', 'password'
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function profiles(){
return $this->hasOne(Profile::class);
}
}
我想要实现的是,当我调用Student::all();
函数时,我会收到所有在学校注册的用户,因此也是学生。
答案 0 :(得分:1)
查看模型事件:https://laravel.com/docs/5.5/eloquent#events
您应该可以将其放入学生模型中进行测试:
protected static function boot(){
parent::boot();
static::retrieved(function($thisModel){
if($thisModel->isNotAStudent or whatever logic you need){
return false;
}
}
}
我还在5.4,它没有内置检索到的模型事件,但返回false通常会阻止调用通过。因此,将该逻辑应用于检索到的事件可能会阻止该模型实例返回(如果它不是学生),但允许返回学生。只是一个想法。
答案 1 :(得分:1)
您提供的解决方案引导我朝着正确的方向前进。我的问题通过使用全局范围来解决:
<?php
namespace App;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\DB;
class Student extends User
{
protected $table= 'users';
protected static function boot()
{
parent::boot();
static::addGlobalScope('student', function (Builder $builder) {
$builder->whereExists(function ($query) {
$query->select(DB::raw(1))
->from('enrollments')
->whereRaw('enrollments.user_id = users.id');
});
});
}
public function enrollments(){
return $this->belongsToMany(Enrollment::class);
}
}