Laravel 4:神奇地称为belongsTo关系的奇怪行为

时间:2013-11-16 12:56:40

标签: php laravel eloquent

我有以下任务模型

class Task extends Eloquent {
    public function user()
    {
        return $this->belongsTo('User');
    }
}

我打电话的时候:

$task = Task::with('user')->first();

我得到以下预期结果:

{
    id      : 10,
    user_id : 20,
    user    : {
        id      : 20
    }
}

以下预期的查询日志:

select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (20);

然而,当我以神奇的方式设置我的关系时,belongsTo关系会破坏:

class Task extends Eloquent {
    public function __call($name, $arguments)
    {
        if ($name === 'user')
            return $this->belongsTo('User');

        return parent::__call($name, $arguments);
    }
}

我得到以下破碎的结果:

{
    id      : 10,
    user_id : 20,
    user    : null // USER IS MISSING!
}

以下破坏的查询日志:

select `tasks`.* from `tasks` limit 1;
select * from `users` where `users`.`id` in (0); // NOTE THE 0 INSTEAD OF 20

我没有收到任何错误。我和belongsToMany尝试过同样的事情,但是效果很好。

由于某种原因,'20'没有传递给belongsTo关系。因此我希望__call()启动一个新的查询实例,但我不明白为什么?

我记录了__call()被触发的时间,但除了'user'方法之外,它似乎根本没有被触发。所以据我所知,这不是问题。

1 个答案:

答案 0 :(得分:1)

这可能是因为Laravel使用其内部方法的名称作为默认外键。试试这个:

return $this->belongsTo('User', 'user_id');