2016-07-25 66 views
0

我正在使用laravel 4.2,並且在db中使用屬性is_active。 當我嘗試訪問該模型屬性: $model->is_active 我收到以下錯誤:如何訪問laravel模型中的is_ *屬性?

Relationship method must return an object of type Illuminate\Database\Eloquent\Relations\Relation

所以問題是如何訪問該屬性? 如果可能,請不要在數據庫中重命名此字段,因爲這是生產中已有的數據庫。

這裏是我的模型類:

class Position extends \Eloquent { 

    protected $table = "hr_positions"; 

    protected $fillable = ['slug', 'info_small', 'info_full', 'is_active', 'start_date', 'end_date', 'tags', 'user_create_id', 'user_update_id']; 

    use \MyApp\Core\StartEndDateTrait; 

    public function postulations(){ 
     return $this->hasMany('Postulation', 'position_id', 'id'); 
    } 
} 

最新通知:

所有在那裏我創造我的實體在頁面上此錯誤ocurrs。在轉發到頁面之前控制器我做: $position = new \Position();

,然後,例如,下面的代碼產生的錯誤,以及: dd(($position->getAttribute('is_active')));

,但如果我更換$position = new \Position();

$position = \Position::first(); 

錯誤消失了?

這到底是怎麼回事?????

回答

1

Laravel做了很多幕後魔術,如,調用了大量的php magic methods

如果沒有定義一個稱爲屬性,__call被調用,其在鋒調用的getAttribute()。 getAttribute($key)所採取的步驟是

  1. 是否有通過此項的數據庫字段?如果是這樣,請將其退回。
  2. 這個鍵有沒有加載關係?如果是這樣,請將其退回。
  3. 有沒有這個鍵的camelCase方法?如果是這樣,請將其退回。 (IS_ACTIVE尋找isActive方法)
  4. 返回null。

即拋出異常的唯一時間是在步驟3

當你創建一個新的實例,雄辯不知道它有什麼樣的領域,所以如果你在有方法相同的名字,它總會拋出一個關係錯誤,這在Laravel4和Laravel5中都是如此。

如何避免呢?使用getAttributeValue($key)方法。它沒有關係檢查,並且默認返回null

另外,您也可以爲您的字段中添加get mutator

+0

我已經嘗試了再次錯誤:'關係方法必須返回一個對象的類型照明\數據庫\ Eloquent \ Relations \ Relation' – gandra404

+0

@ gandra404你有一個''isActive()''''''''''''類嗎? – Kaspars

+0

這裏有一些事實: - 我沒有方法isActive()在'位置'類 - 我有數據庫字段'is_active':https://i.imgur.com/IkriM6C.png – gandra404

0

我發現了這個黑客。仍然不理想,但至少我有一些解決方案。比沒有更好。

所以這段代碼產生的問題:

$position = new \Position(); 
if($position->is_active){ 
    // 
} 

,這一次工作得很好,這是解決方案甚至哈克,但解決方案:

$position = new \Position(['is_active' => 0]); 
if($position->is_active){ 
    // 
} 

我會等待,如果有人提供更好的,更清潔的解決方案。如果在接下來的幾天裏沒有人來,我會接受我的。