基本上我的问题是我的模型没有从其超类继承所需的属性。我已经发现这个问题:inherited attribute is null,它解决了同样的问题。但是该解决方案对我不起作用。
我尝试了,但是可填充属性没有设置。我的子类无权访问这些属性。
也许我做错了什么?
额外信息(我猜不是必需的)
我的情况是这样的:用户(表“用户”)可以是顾问(表“顾问”)和/或客户(表“客户”)。
关于用户的所有一般信息;名字,姓氏,...存储在用户表中。诸如 customer_number 或功能之类的特定信息存储在适当的表中。顾问和客户在应用程序中扮演不同的角色,因此具有不同的关系。
我设计了模型,以便 Advisor 和 Customer 继承自超类 User:
class User extends Eloquent implements UserInterface, RemindableInterface {
protected $fillable = array('email', 'first_name', 'last_name', 'email', 'gender', 'phone_number', 'profile_picture');
protected $hidden = array('password');
protected $guarded = array('id', 'password');
protected $table = 'users';
...
}
还有我的顾问课程:
class Advisor extends User {
protected $table = 'advisors';
protected $fillable = array('active', 'function', 'description') ;
//this does not work!
public function __construct (array $attributes = array()) {
// the static function getFillableArray() just returns the fillables array
$this->fillable = array_merge ($this->fillable, parent::getFillableArray());
parent::__construct($attributes);
}
...
}
我还尝试在设置可填充项之前调用构造函数,如以下建议:这个问题。也没有效果。
有效的方法是在 User 超类中编写访问器,如下所示:
// Attribute getters - Inheritence not working
public function getFirstNameAttribute($value)
{
$returnValue = null;
if($value){
$returnValue = $value;
}else{
$returnValue = User::find($this->id)->first_name;
}
return $returnValue;
}
但是由于显而易见的原因,这很丑陋,效率不高,而且很糟糕。 难道我真的没有办法继承这些属性吗?我错过了什么?
提前致谢
解决问题的另一种方法是,由于您在数据库中设计了单表继承结构,因此您可以使用此处解释的 Laravel eloquent 关系函数:http://laravel.com/docs/eloquent#relationships。这将允许您访问超类的属性,例如:
//in your Advisor model
public function profile()
{
return $this->belongsTo('User');
}
//to call for advisor's first name
Advisor::find($id)->profile->first_name;