2013-12-14 44 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();