Унаследованные атрибуты от моделей Eloquent недействительны в Laravel 4.

В основном моя проблема в том, что мои модели не наследуют необходимые атрибуты от своего суперкласса. Я уже нашел этот вопрос: унаследованные атрибуты равны нулю, что решает ту же проблему . Однако решение не сработало для меня.

Я пробовал, но заполняемые атрибуты просто не установлены. Мои подклассы не имеют доступа к атрибутам.

Может я что-то не так делаю?


Дополнительная информация (не обязательно, я думаю)

Моя ситуация такова: Пользователи (таблица «пользователи») могут быть консультантами (таблица «советники») и/или клиентами (таблица «клиенты»).

Итак, вся общая информация о пользователях; first_name, last_name, ... хранятся в таблице пользователей. Конкретная информация, такая как номер_клиента или функция, хранится в соответствующих таблицах. И консультанты, и клиенты имеют разные отношения, поскольку у них разные роли в приложении.


Я разработал свои модели так, чтобы 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;
}

Но это некрасиво, неэффективно и плохо по понятным причинам. Неужели я никак не могу унаследовать эти атрибуты? Что мне не хватает?

заранее спасибо


person Thomas Simoens    schedule 06.05.2014    source источник


Ответы (1)


Альтернативный подход к вашей проблеме, поскольку вы разработали единую структуру наследования таблиц в своей БД, вы могли бы использовать функцию красноречивых отношений Laravel, описанную здесь: 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;
person har2vey    schedule 07.05.2014
comment
Боже мой, я совершенно проглядел это. Хотя я хотел бы на самом деле отслеживать атрибуты в самом классе. Но это приемлемый ответ, я думаю. Я опубликую свое решение позже на этой неделе. Я использую атрибут $appends, таким образом я могу просто заполнить им класс User, но в основном это предлагаемое вами решение. Спасибо! - person Thomas Simoens; 08.05.2014