在我的模型中,我想添加一个角色属性,该属性是一个基于返回用户模型具有的关系的值,因此我的用户模型在其上有各种关系,如下所示,
/*
* 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
有没有人知道如何实现这个目标?
答案 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