Laravel 拉威尔:有没有办法得到一个模型';对于任何给定的字段名,是否存在与另一个表的关系?

Laravel 拉威尔:有没有办法得到一个模型';对于任何给定的字段名,是否存在与另一个表的关系?,laravel,laravel-4,Laravel,Laravel 4,我有一个场景,希望提供给定表的字段列表(以及单行的ID),并返回数据。但是我想要任何一个作为查找的字段也能自动获取查找数据 我已经为查找字段建立了关系,但希望我的代码自动查找在每个字段上建立的任何关系 这可能吗 -- 例如,我有一个“jobs”表,其中包含一些其他表的查找字段: id description job_type_id repro_status_id job_status_id customer_id supplier_id ... 然后我有了我的“工作”模型,并使用了拉威尔的约定

我有一个场景,希望提供给定表的字段列表(以及单行的ID),并返回数据。但是我想要任何一个作为查找的字段也能自动获取查找数据

我已经为查找字段建立了关系,但希望我的代码自动查找在每个字段上建立的任何关系

这可能吗

--

例如,我有一个“jobs”表,其中包含一些其他表的查找字段:

id
description
job_type_id
repro_status_id
job_status_id
customer_id
supplier_id
...
然后我有了我的“工作”模型,并使用了拉威尔的约定来建立关系:

class Job extends BaseModel {

  public function jobStatus (){
    return $this->belongsTo('JobStatus', 'job_status_id');
  }
  public function jobType (){
    return $this->belongsTo('JobType', 'job_type_id');
  }
  public function customer (){
    return $this->belongsTo('Customer', 'customer_id');
  }
  // etc...
}
因此,在建立了这些关系之后,能够获得基于fieldname的关系会很有帮助。类似于

// Made up code
Job::getRelationshipByFieldname('job_type_id'); // Returns the jobType method

我这样做的原因是:我正在为“jobs”表构建表单字段列表,但需要捕获任何字段上的任何关系。

开箱即用,在Laravel中没有这样的内容,但如果列遵循某种模式和/或Laravel的命名约定,则可以在基本模型上创建一个方法:

class BaseModel extends Eloquent {

    public function getRelationshipByFieldname($field)
    {
        // Converts job_status_id into jobStatus

        $method = camel_case(substr($field, 0, strlen($field) - 3));

        return call_user_func(static::class . '::' . $method);
    }

}
class BaseModel extends Eloquent {

    private $relationMethods = [
        'job_status_id' => 'jobStatus',
        'job_type_id' => 'jobType',
        'customer_id' => 'customer',
    ];

    public function getRelationshipByFieldname($field)
    {
        $method = camel_case($this->relationMethods[$field]);

        return call_user_func(static::class . '::' . $method);
    }

}
如果无法坚持约定,则始终可以映射基本模型中的方法:

class BaseModel extends Eloquent {

    public function getRelationshipByFieldname($field)
    {
        // Converts job_status_id into jobStatus

        $method = camel_case(substr($field, 0, strlen($field) - 3));

        return call_user_func(static::class . '::' . $method);
    }

}
class BaseModel extends Eloquent {

    private $relationMethods = [
        'job_status_id' => 'jobStatus',
        'job_type_id' => 'jobType',
        'customer_id' => 'customer',
    ];

    public function getRelationshipByFieldname($field)
    {
        $method = camel_case($this->relationMethods[$field]);

        return call_user_func(static::class . '::' . $method);
    }

}

感谢@JarekTkaczyk-已更新。如果您遵循Laravel的命名约定,通常如果您在
job\u-type\u-id
上进行关联,则您可以命名关系
JobType
JobTypes
,因此您可以对单数和复数名称调用
method\u-exists
。这不是最好的选择(我相信可以通过反射来实现),但可能是one@BenHull所以基本上你想自动加载关系,对吗?谢谢你的评论@JarekTkaczyk我想这就是我想要的是的。安东尼奥下面的回答总结得恰到好处。谢谢你的帮助!谢谢你的澄清。我已经开始使用数组来存储字段到函数的映射,所以我将继续这样做。谢谢