Laravel 5.3为模型添加自定义属性

时间:2017-01-27 20:32:43

标签: php laravel

在我的模型中,我想添加一个角色属性,该属性是一个基于返回用户模型具有的关系的值,因此我的用户模型在其上有各种关系,如下所示,

   /*
    * User - Supers
    * 1:1
    */
    public function super() {
        return $this->hasOne('App\Super');
    }

   /*
   * User - Teachers
   * 1:1
    */
   public function staff() {
        return $this->hasOne('App\Teacher');
   }

    /**
     * User - Students
     * 1:1
     */
    public function student() {
        return $this->hasOne('App\Student');
    }

我想要做的是检查用户是否有学生或超级关系,并根据该关系设置角色属性。

我以为我能够做到这样的事情,

public function getRoleAttribute() {
    if($this->student()->user_id) {
        return "Student";
    }
    //if($this->super)
}

但遗憾的是,返回的异常就是这个,

  

未定义属性:Illuminate \ Database \ Eloquent \ Relations \ HasOne :: $ user_id

有没有人知道如何实现这个目标?

1 个答案:

答案 0 :(得分:0)

好的,我起初误解了这个问题。

更好的方法是创建关系检测函数并在模型的构造函数中调用它,然后将其分配给新属性。

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model {

    protected $table = 'Users'; 
    private $role;

    public __construct() {
        $this->setRole();
    }

    private function setRole() {
        if (count($this->super)){
            $this->role = 'super';
        }elseif (count($this->staff)) {
            $this->role = 'staff';
        } elseif (count($this->student)) {
            $this->role = 'student';
        } else {
            $this->role = 'none';
            throw new \exception('no relation');
        }
    }

    public function super() {
        return $this->hasOne('App\Super');
    }

    /*
    * User - Teachers
    * 1:1
    */
    public function staff() {
        return $this->hasOne('App\Teacher');
    }

    /**
    * User - Students
    * 1:1
    */
    public function student() {
        return $this->hasOne('App\Student');
    }  
}

我将部分答案基于Laravel check if related model exists

编辑:Laravel有一个内置的方法来设置属性https://github.com/illuminate/database/blob/v4.2.17/Eloquent/Model.php#L2551