我的Laravel 4项目中有3个模型:Employee
,EmployeeClass
,Employer
:
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
正常工作的事实,以及获取查询并执行它(在第二个成功的代码集中)的事实也是如此,有点证明了这一点。
我确定我只是在做一些愚蠢的事;也许另一组眼睛会有所帮助!
我可以使用解决方法(第二组代码)因为它似乎正在工作但我想尽可能让它干净整洁......
答案 0 :(得分:4)
对于多字关系,函数应该在camelCase中(事实上,所有类方法都应该)。在访问模型的属性时,仍然允许以蛇形式访问关系名称(在您的示例中,'employee_class',但请注意,这会绕过所有急切加载,您应该以与关系方法完全相同的方式访问关系)名。
在您的示例中,如果您将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();