Eloquent 模型列作为属性

Eloquent model columns as properties

我正在与 laravel 和 eloquent 合作,很抱歉,如果这是一个愚蠢的问题,我已经在 google 上进行了一些搜索,但找不到像这样。

我有一个 Company 模型,它与 CompanyProperties 模型有 "hasMany" 关系。 CompanyProperties 有两列:"name" 和 "value".

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

当我通过 Company::all() 获得公司时;它完美地加载了每家公司的 CompanyProperties。每个 CompanyProperty returns 一个集合,我可以使用 $company->CompanyProperties[0...n].

访问它

如果可能的话,我想做的是使用 "name" 列值作为 属性 或数组访问 CompanyProperties。使用上面我的 table 的示例: $公司->公司属性['primaryColor'] 要么 $公司->公司属性['secondaryColor']

有办法吗?

哦,是的,在此先感谢您。 我很感激您对此提出的任何建议(即使我必须更改 "properties" 方法,哈哈)。

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

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

这个returns一个数组,其中值是第一个参数('Value'),键是第二个参数('Name'),例如

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

但是,这可能效率很低,因为您要 运行 查询您获取的每个公司。如果只是一家或几家公司没问题,但考虑到您正在使用 Company:all() 我会建议预先加载:

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

这将在单个查询中获取所有公司的属性。现在对于每个 $company,$company->companyProperties 是一个 Collection. So you can use the keyBy 方法:

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

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

注意语法略有不同,$properties['primaryColor']仍然是一个companyProperties对象,所以你必须得到属性->Value