2013-12-14 42 views
3

我有3種型號在我Laravel 4項目:EmployeeEmployeeClassEmployerLaravel 4:模型關係不工作(有點)?

class Employee extends Eloquent { 
    protected $table = 'users'; 
    public function employee_class() { 
     return $this->belongsTo('EmployeeClass', 'employee_class_id'); 
    } 
} 
class EmployeeClass extends Eloquent { 
    protected $table = 'employee_classes'; 
    public function employees() { 
     return $this->hasMany('Employee'); 
    } 

    public function employer() { 
     return $this->belongsTo('Employer'); 
    } 
} 
class Employer extends Eloquent { 
    protected $table = 'employers'; 
    public function employee_classes() { 
     return $this->hasMany('EmployeeClass'); 
    } 
} 

EmployeeClass關係正常工作。我可以執行EmployeeClass::find(1)->employees;EmployeeClass::find(1)->employer;並返回該對象。

試圖在其他兩個上撥打相同的電話(以檢索與EmployeeClass的關係)不起作用。這兩個行返回空集:

Employee::find(1)->employee_class; 
Employer::find(1)->employee_classes; 

然而,奇怪的是,這兩個線路的正常工作:

Employee::find(1)->employee_class()->first(); 
Employer::find(1)->employee_classes()->first(); 

第一個例子返回NULL(我認爲它應該返回一個Collection )。第二個示例返回一個EmployeeClass對象(預期的實例)。

我想指出,每個表中有一個條目,其中id爲1,並且每個表中都設置了FK = 1,因此它們應該正確連接。事實上,我認爲EmployeeClass工作正常,事實上獲取查詢並執行它(在第二個成功的代碼集合中)也可以做到這一點,可以證明這一點。

我確定我只是在做一些愚蠢的事情;也許另一組眼睛會幫助!

我可以使用的解決方法(第二組代碼),因爲它似乎是工作,但我想獲得它的清潔和正確的,如果可能的話...

+1

你在工匠 – rjm226

+1

HTTP生成這些.io/viewtopic.php?pid = 53285#p53285 – matpop

+0

@matpop就是這樣!謝謝!我一直在搜索谷歌,我無法相信我找不到那個。 –

回答

4

對於多字的關係,該函數應該在camelCase中(實際上,所有的類方法都應該)。在訪問模型的屬性時,仍然允許訪問snake案例中的關係名稱(在您的示例中,'employee_class',但請注意,這會繞過所有的預先加載,您應該以與關係方法完全相同的大小寫方式訪問關係。?//forums.laravel:名稱

在你的榜樣,如果重命名employee_class(ES)功能employeeClass(ES),一切都應該工作

// gets all employees and their class(es). the argument(s) for with() 
// MUST match the names of the methods exactly. 
Employee:with('employeeClass')->get(); 

// you MUST access eager loaded data in the same case as in with(). 
// if you access via snake case, eager loading is bypassed. 
$employee->employeeClass; 

// this also works but should generally be avoided. 
Employee::find(1)->employeeClass()->first();