Laravel 4中Eloquent模型的继承属性为null

时间:2014-05-06 18:14:22

标签: inheritance attributes null laravel-4 superclass

基本上我的问题是我的模型没有从超类中继承所需的属性。我已经找到了这个问题:inherited attributes are null,它解决了同样的问题。但是解决方案对我不起作用。

我尝试了,但是没有设置可填充属性。我的子类无法访问属性。

也许我做错了什么?


额外信息(我猜不是必不可少的)

我的情况是这样的:用户(表'用户')可以是顾问(表'顾问')和/或顾客(表'顾客')。

所有关于用户的一般信息; first_name,last_name,...存储在users表中。 customer_number或function等特定信息存储在appropriat表中。顾问和客户都有不同的关系,因为他们在应用程序中有不同的角色。


我设计了我的模型,以便Advisor和Customer继承超级用户:

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);
    }
    ...
 }

我还尝试在设置fillables之前调用构造函数,如:this question所示。也没用。

有什么用,就是在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;
}

但是这很丑陋,没有效率,也没有明显的原因。 我真的没办法继承这些属性吗?我错过了什么?

提前致谢

1 个答案:

答案 0 :(得分:1)

由于您在数据库中设计了单个表继承结构,因此您可以使用Laravel eloquent relationship函数解决问题的另一种方法: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;