Laravel 4:模型关系不起作用(某种程度)?

时间:2013-12-14 18:57:21

标签: php laravel laravel-4

我的Laravel 4项目中有3个模型:EmployeeEmployeeClassEmployer

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 个答案:

答案 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();