Laravel 5.7 数据库设计布局/集合的平均值
Laravel 5.7 Database Design Layout / Average from Collection
我有一个情况,每个 Order
可以有 Feedback.
如果产品是物理的,Feedback
可以有很多 packaging_feedbacks.
packaging_feedbacks
应该与 packaging_feedback_details.
有关系
反馈模型
public function packagingFeedbacks()
{
return $this->hasManyThrough('App\PackagingFeedbackDetail', 'App\PackagingFeedback',
'feedback_id', 'id', 'id', 'user_selection');
}
packaging_feedback_details
id|type_id(used to group the "names" for each feedback option)|name
1 0 well packed
2 0 bad packaging
3 1 fast shipping
4 1 express delivery
packaging_feedbacks
id|feedback_id|user_selection (pointing to the ID of packaging_feedback_details)
1 1 2
2 1 6
3 1 7
4 1 12
5 1 15
6 1 17
7 2 1
8 2 6
9 2 7
10 2 12
11 2 15
12 2 17
13 3 1
14 3 6
15 3 7
16 3 12
17 3 15
18 3 17
现在我希望能够获得用户对实体产品的平均选择。我开始使用:
$result = Product::with('userFeedbacks.packagingFeedbacks')->where('id', 1)->first();
$collection = collect();
foreach ($result->userFeedbacks as $key) {
foreach ($key->packagingFeedbacks as $skey) {
$collection->push($skey);
}
}
foreach ($collection->groupBy('type_id') as $key) {
echo($key->average('type_id'));
}
但它 returns 不是平均 ID,因为它会计算平均值而不是我需要的计算方式。有没有更好的方法,因为我认为这不是最聪明的方法。一般来说,我的数据库设计是 "best" 处理这个问题的方法吗?
您在这里寻找的平均值类型是 模式。 Laravel 的集合实例有一个 mode() 方法,该方法在 5.2 中引入,当提供一个键时 returns 一个包含该键的最高出现值的数组。
如果我正确理解了你的问题,这应该能满足你的要求:
$result->userFeedbacks
->flatMap->packagingFeedbacks
->groupBy('type_id')
->map->mode('id');
以上是在集合上利用 flatMap() and higher order messages()。
我有一个情况,每个 Order
可以有 Feedback.
如果产品是物理的,Feedback
可以有很多 packaging_feedbacks.
packaging_feedbacks
应该与 packaging_feedback_details.
反馈模型
public function packagingFeedbacks()
{
return $this->hasManyThrough('App\PackagingFeedbackDetail', 'App\PackagingFeedback',
'feedback_id', 'id', 'id', 'user_selection');
}
packaging_feedback_details
id|type_id(used to group the "names" for each feedback option)|name
1 0 well packed
2 0 bad packaging
3 1 fast shipping
4 1 express delivery
packaging_feedbacks
id|feedback_id|user_selection (pointing to the ID of packaging_feedback_details)
1 1 2
2 1 6
3 1 7
4 1 12
5 1 15
6 1 17
7 2 1
8 2 6
9 2 7
10 2 12
11 2 15
12 2 17
13 3 1
14 3 6
15 3 7
16 3 12
17 3 15
18 3 17
现在我希望能够获得用户对实体产品的平均选择。我开始使用:
$result = Product::with('userFeedbacks.packagingFeedbacks')->where('id', 1)->first();
$collection = collect();
foreach ($result->userFeedbacks as $key) {
foreach ($key->packagingFeedbacks as $skey) {
$collection->push($skey);
}
}
foreach ($collection->groupBy('type_id') as $key) {
echo($key->average('type_id'));
}
但它 returns 不是平均 ID,因为它会计算平均值而不是我需要的计算方式。有没有更好的方法,因为我认为这不是最聪明的方法。一般来说,我的数据库设计是 "best" 处理这个问题的方法吗?
您在这里寻找的平均值类型是 模式。 Laravel 的集合实例有一个 mode() 方法,该方法在 5.2 中引入,当提供一个键时 returns 一个包含该键的最高出现值的数组。
如果我正确理解了你的问题,这应该能满足你的要求:
$result->userFeedbacks
->flatMap->packagingFeedbacks
->groupBy('type_id')
->map->mode('id');
以上是在集合上利用 flatMap() and higher order messages()。