2015-10-15 84 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