2013-07-12 57 views
1

我在與Laravel的ORM一個繁瑣的問題。Laravel:屬於關聯()關係假設一個一對多的關係,而不是一個對一個

我有多重關係的模型,像這樣:

class Pages extends Eloquent { 

    protected $guarded = array('id','config_id'); 

    public function template() 
    { 
     return $this->belongsTo('Templates', 'templates_id'); 
    } 

    public function updateUser() 
    { 
     return $this->belongsTo('Users', 'updated_by'); 
    } 

現在我可以訪問該模板相關的項目在一個簡單的方法,就像這樣:

$this->template->name; 

和它的作品出來的蝙蝠,因爲Laravel的ORM假定它是一個一對一的關係和內部調用第一()方法。

但是,當我嘗試與updateUser相同時失敗,返回一個錯誤,說它不能在非對象上調用名稱。

但如果我試試這個:

$this->updateUser()->first()->name; 

它的工作原理,但並不覺得我的權利。

所以我的問題是,Laravel的ORM如何決定是否有屬於關聯()定義的關係是一對一或一對多?有沒有辦法強制所需的行爲?

謝謝

+0

您使用'hasOne()'在其他地方設置的關係?和你閱讀[文件](http://four.laravel.com/docs/eloquent#one-to-one)? – naththedeveloper

+0

是的,我讀過的文檔。我沒有在其他地方使用hasOne(),因爲單個用戶可能是許多頁面的更新者,從用戶的角度來看,它是一對多的關係,但是從一個頁面到另一個頁面是一對一的關係。 – Ingro

回答

3

您需要定義關係。您可以從視角定義「不同」關係。

->belongsTo()函數是一個反函數 - 但您還沒有在用戶表上定義任何內容 - 所以錯誤地假設反函數是一對多的。

只需添加到您的用戶等級:

class Users extends Eloquent { 

    public function pages() 
    { 
     return $this->hasMany('Pages'); 
    } 
} 
+0

那麼它似乎我是缺了一塊,謝謝你的澄清! – Ingro

+0

對不起,我沒有得到你的答案......這是否意味着我需要總是定義關係的反函數來工作?如果我不想從另一個模型中建立關係模型,該怎麼辦? –