我正在使用laravel和eloquent,我很抱歉,如果这是一个愚蠢的问题,我已经在google上进行了一些搜索但是找不到这样的东西。
我有一个公司模型,它与CompanyProperties模型有“hasMany”关系。 CompanyProperties有两列:“name”和“value”。
id | Name | Value
1 | primaryColor | #000
2 | secondaryColor | #333
当我通过Company :: all()获得公司时;它完美地加载了每家公司的CompanyProperties。每个CompanyProperty都会返回一个集合,我可以使用$ company-> CompanyProperties [0 ... n]访问该集合。
如果可能使用“name”列值作为属性或数组访问CompanyProperties,我想做什么。使用上面的表格示例: $公司 - > CompanyProperties [ 'primaryColor'] 要么 $ company-> CompanyProperties ['secondaryColor']
有办法做到这一点吗?
哦,是的,非常感谢提前。我感谢您对此提出的任何建议(即使我必须改变“属性”方法,哈哈)。
答案 0 :(得分: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->companyProperties
都是Collection。所以你可以使用keyBy方法:
foreach ($companies as $company) {
$properties = $company->companyProperties->keyBy('Name');
$value = $properties['primaryColor']->Value; // '#000'
}
请注意,语法略有不同,$properties['primaryColor']
仍然是companyProperties对象,因此您必须获取属性->Value