Eloquent模型列作为属性

时间:2015-10-15 17:34:13

标签: laravel laravel-5 eloquent data-modeling

我正在使用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']

有办法做到这一点吗?

哦,是的,非常感谢提前。我感谢您对此提出的任何建议(即使我必须改变“属性”方法,哈哈)。

1 个答案:

答案 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