Laravel:对于任何给定的字段名,有没有办法与另一个表建立模型的关系?

时间:2014-09-25 13:51:25

标签: laravel laravel-4

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

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

这可能吗?

-

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

id
description
job_type_id
repro_status_id
job_status_id
customer_id
supplier_id
...

然后我将我的模型用于'工作',并使用Laravel的惯例来创建关系:

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'表构建一个表单字段列表,但需要捕获任何字段上的任何关系。

1 个答案:

答案 0 :(得分:0)

开箱即用,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);
    }

}