在我的Laravel应用程序中,民意调查有很多民意调查选项。我可以通过简单地运行来创建这些选项的集合:
$result = Poll::find(1)->options()->get();
此查询返回:
Collection {#387 ▼
#items: array:6 [▼
0 => PollOption {#388 ▼
#table: "poll_options"
#connection: null
#primaryKey: "id"
#keyType: "int"
#perPage: 15
+incrementing: true
+timestamps: true
#attributes: array:8 [▼
"id" => 1
"poll_id" => 1
"option_text" => "Never"
"responses" => 54
"is_public" => 0
"created_at" => null
"updated_at" => null
"deleted_at" => null
]
#original: array:8 [▶]
#relations: []
#hidden: []
#visible: []
#appends: []
#fillable: []
#guarded: array:1 [▶]
#dates: []
#dateFormat: null
#casts: []
#touches: []
#observables: []
#with: []
#morphClass: null
+exists: true
+wasRecentlyCreated: false
}
1 => PollOption {#389 ▶}
2 => PollOption {#390 ▶}
3 => PollOption {#391 ▶}
]
}
在我的poll选项中,有一个名为responses
的列,它返回一个整数。我需要采用上面的集合并隔离responses
键/值对。
Collection {#385 ▼
#items: array:6 [▼
"responses" => 54
"responses" => 20
"responses" => 10
"responses" => 123
"responses" => 33
"responses" => 11
]
}
only()
集合方法正是我所需要的,但在使用Eloquent模型时,我无法弄清楚如何构建查询:
$options = Poll::find(1)->options()->get();
$responses = $options->only('responses');
dd($responses->all());
返回一个空集合,因为responses
值嵌套在PollOption
对象中。
我也试过了flatten()
,但这种情况似乎没有效果。
是否有更简单的方法在Eloquent模型集合中返回单个键/值对?
答案 0 :(得分:2)
实际上不可能将相同的密钥分配给集合中的多个值。我知道这一点,但我没有正确地思考这个问题。
对于将来的开发人员:pluck()
方法有两个参数:要拔除的值,以及分配给键的第二个值。使用上面的场景,我能够写:
$result = $poll->options()->pluck('responses', 'option_text'); //Value and corresponding key
这导致类似:
Collection {#386 ▼
#items: array:6 [▼
"Never" => 54
"Occasionally" => 21
"2–3 times a week" => 80
"4–5 times per week" => 33
"Daily" => 11
]
}
最终做了我需要它做的事情。 Amit Gupta的mapWithKeys()答案也是正确的,并会让你在同一个地方。