为子类型

时间:2017-11-22 12:52:46

标签: php laravel eloquent laravel-5.5

我正在创建一个学校平台,学生,教师......可以使用他们的凭据登录。为了减少重复数据,我没有创建一个名为students的单独表,而是将所有数据保存在users表中。

要知道用户是否是学生我有一个名为注册的表,在此表中存储了user_idschoolyear_idclass_id

我已经制作了一个引用用户表的学生模型,但是如何确保该模型仅通过学生?

EER: EER overview

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();函数时,我会收到所有在学校注册的用户,因此也是学生。

2 个答案:

答案 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);
    }

}