【问题标题】:How to get array values from Eloquent pluck method如何从 Eloquent pluck 方法中获取数组值
【发布时间】:2019-12-20 04:32:40
【问题描述】:

我有一个包含两列 X 和 Y 的表格,数据类似于:

X   Y
1   1
1   2
1   3
1   4
2   5
2   6

当我做类似->pluck('Y', 'X') 的事情时,我想要一个类似的答案:

['1' => [1,2,3,4], '2' => [5,6]]

但是它只是给了我一个值而不是像一个数组

['1' => 1, '2' => '5']

如何将值设为数组?

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    使用reduce

    $collection->reduce(function ($carry, $item) {
        // First iteration
        if ($carry == null) {
            $carry = [];
        }
    
        $carry[$item->X][] = $item->Y;
        return $carry;
    });
    

    使用groupBy

    $collection->groupBy('X')->map(function ($item) {
        return $item->pluck('Y');
    })->toArray()
    

    使用mapToGroups

    $collection->mapToGroups(function ($item) {
        return [$item['X'] => $item['Y']];
    })->toArray()
    

    【讨论】:

    • 这比我以前得到的更接近!现在你建议的 groupBy 方法返回 [1 => [["X": "1", "Y": "1"], ["X": "1", "Y": "2"], ["X": "1", "Y": "3"]... 所以现在数组太多了。
    • reduce 方法给出了正确的答案。你认为有一个使用 groupBy 的解决方案还是我应该坚持使用 reduce?
    • 我会更新答案并用groupBy修复问题
    • 感谢您的更新!如果这三种方法都有效,是否有任何理由选择其中一种?
    • 我注意到一件事,这是一个低优先级,但如果可以修复它会很好,它会改变 Y 列中要排序的值的顺序。在我上面的示例数据中,它们已经排序,但如果它们的顺序不同,使用上述方法,它们总是排序出来的。我尝试了所有三个,结果相同。
    猜你喜欢
    • 2019-04-17
    • 2017-03-07
    • 2020-12-12
    • 2017-03-08
    • 2020-07-09
    • 1970-01-01
    • 2015-02-25
    • 2016-03-28
    • 2021-12-07
    相关资源
    最近更新 更多