2014-09-25 20 views
0

我有一個場景,我想提供給定表的字段列表(以及單個行的ID)並返回數據。但我想要查看任何字段以自動獲取查找數據。Laravel:有沒有辦法讓任何給定字段名的模型與另一個表的關係?

我建立了查找字段的關係,但希望我的代碼自動查找在每個字段上建立的任何關係。

這可能嗎?

-

例如,我有幾個查找字段到其他桌的「工作」表:

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... 
} 

因此,建立這些關係,將有助於能夠得到基於字段名的關係。喜歡的東西...

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

而且我想這樣做的理由:我建立表單字段列表的「工作」表,但需要捉對任何領域的任何關係。

+1

顯示您的數據庫架構 – 2014-09-25 14:45:20

+0

感謝@JarekTkaczyk - 已經更新。 – 2014-09-26 10:45:22

+0

如果你遵循Laravel的命名約定,通常如果你涉及'job_type_id',你要麼命名關係'JobType'或'JobTypes',所以你可以用單數和複數名稱來調用'method_exists'。不是最好的選擇(我肯定可以用Reflection來完成)但是可能的一個 – Joe 2014-09-26 10:46:31

回答

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); 
    } 

} 
+0

感謝您在此澄清。我已經開始使用數組來存儲一個字段到函數映射的路線,所以我將繼續這樣。謝謝。 – 2014-09-26 13:25:28

相關問題