关系方法的雄辩模型反思

时间:2015-02-17 14:18:09

标签: php reflection laravel-4 eloquent

我在模型上通过反射调用关系方法时遇到问题。我的模特是:

class User extends \Eloquent
{
    public function city()
    {
        return $this->belongsTo('City', 'city_id', 'id');
    }
}

class City extends \Eloquent
{
}

当我在User类的ReflectionMethod实例上调用city方法时,我没有得到City模型。我认为这个问题与Eloquent延迟加载有关,但我无法解决问题:(任何想法?

提前感谢您的回答!

更新

我的反思代码:

$rc = new \ReflectionClass($model);

if ($rc->hasMethod($fieldName)) {
    // This two calls below are returning: "Relationship method must return 
    // an object of type Illuminate\Database\Eloquent\Relations\Relation"
    $relation = $rc->getMethod('getAttribute')->invoke($model, $fieldName);

    $rc->getMethod($fieldName)->invoke($model);

    // And this one is returning: "Property city does not exist"
    $rp = $rc->getProperty($fieldName);
}

2 个答案:

答案 0 :(得分:0)

调用关系方法将永远不会返回模型。它返回关系对象。您可以通过访问动态属性city(或调用getAttribute('city'))或调用关系方法然后get() ->city()->get()来获取模型。

要对->city->city()进行更深入的分析,请参阅my answer on this post

答案 1 :(得分:0)

在Select2第4版上,我遇到了一个问题让我感到困惑了一分钟,希望任何遇到同一问题的人都会觉得这篇文章很有帮助。

我一直在使用“templateSelection”,这导致了预先设置选择值的问题,因为它没有从我的ajax响应中返回正确的信息。这是我的修复:

templateSelection: function(repo){

    if(typeof repo.name != 'undefined'){
        return repo.name;
    }

    return repo.text;
}

我的ajax响应在我的回复中返回了一个“名称”值但是当我设置一个预选选项时,它会以“文本”返回。所以我只是做了一个检查。