从Laravel模型关系

时间:2016-10-27 15:50:09

标签: php laravel collections eloquent

在我的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模型集合中返回单个键/值对?

1 个答案:

答案 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()答案也是正确的,并会让你在同一个地方。