2015-10-15 61 views
1

我正在使用laravel和雄辯,我很抱歉,如果這是一個愚蠢的問題,我已經在谷歌上做了一些搜索,但找不到像這樣的東西。雄辯的模型列作爲屬性

我有一個與CompanyProperties模型有「hasMany」關係的公司模型。 CompanyProperties有兩列:「名稱」和「值」。

id | Name   | Value 
1 | primaryColor | #000 
2 | secondaryColor | #333 

當我得到Company :: all()的公司時,它完美加載每個公司的CompanyProperties。每個CompanyProperty都會返回一個集合,我可以使用$ company-> CompanyProperties [0 ... n]訪問該集合。

如果可能的話,我想要做的是CompanyProperties可以使用「name」列值作爲屬性或數組訪問。用我的表上面的例子: $公司 - > CompanyProperties [ 'primaryColor'] 或 $公司 - > CompanyProperties [ 'secondaryColor']

有沒有辦法做到這一點?

噢,非常感謝提前。我很欣賞你對此的任何建議(即使我必須改變「屬性」方法,哈哈)。

回答

1

Laravel 5.1和之前:使用lists方法
Laravel 5.2:使用pluck

$properties = $company->companyProperties()->pluck('Value', 'Name'); 

這將返回一個數組,其中的值是所述第一參數('Value')和鍵是第二個參數('Name'),例如

$value = $properties['primaryColor']; // '#000' 

但是,這可能是相當低效的,因爲您正在爲您獲取的每個公司運行查詢。如果它只是一個或幾個公司沒關係,但考慮到你使用Company:all()我會建議預先加載:

$companies = Company::all(); 
$companies->load([ 
    'companyProperties' 
]); 

這將在一個查詢中獲取所有公司的屬性。現在對於每一個公司,$company->companyPropertiesCollection。所以,你可以使用keyBy方法:

foreach ($companies as $company) { 
    $properties = $company->companyProperties->keyBy('Name'); 

    $value = $properties['primaryColor']->Value; // '#000' 
} 

注意語法稍有不同,$properties['primaryColor']仍然是一個companyProperties對象,所以你必須得到屬性->Value

+0

而最後一個不相關的建議,我只想給方法名稱「屬性」。您仍然可以調用「CompanyProperties」類,或者更好地將其命名爲「App \ Companies \ Properties」。 '$ company-> companyProperties'對我來說只是感覺多餘 – andrewtweber

+1

謝謝。這些建議絕對有助於我,命名建議也非常靈活,實際上我覺得事實上,現在我知道如何解決它。再次感謝。 – Chuy

+0

不客氣:) – andrewtweber