2017-01-27 2 views
0

В пределах моей модели я желающая добавить атрибут роли, значения на основе того, что отношения модели возвращения пользователя имеет, так что моя модель пользователя имеет различные отношения на нем, как показано ниже,Laravel 5.3 добавить пользовательский атрибут модели

/* 
    * 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) 
} 

, но, к сожалению, нет, исключение, которое получает возвращение этого

Не определено свойство: загоритесь \ Database \ Красноречивые \ Отношения \ HasOne :: $ user_id

Кто-нибудь может понять, как я могу это достичь?

+0

Что вопрос, что делать? Что он вернулся? –

+0

добавлена ​​дополнительная информация. – Udders

+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

+0

Это работает, только если я сделаю что-то вроде User :: find (1) -> role, я хочу, чтобы роль возвращалась со всеми пользователями, когда я do User :: all() – Udders

+0

Цикл Foreach для пользователей и вызов атрибута? –

Смежные вопросы