Laravel Eloquent的pluck方法如何保留键名

20

我在 Laravel 中有以下这个集合:

 ["TheNumbers":[{"episodeID":16818,"episodeNumber":100,"created_at":null,"updated_at":null},{"episodeID":16818,"episodeNumber":210,"created_at":"2017-02-20 21:30:38","updated_at":"2017-02-20 21:30:38"}]
如果我运行以下代码:

If I run the following code:

$TheEpisode->TheNumbers->pluck('episodeNumber');

我将得到以下结果:

[100,210]

我希望为每个数字保留其对应的键,我该如何实现?

编辑: 期望结果:

这是我的期望结果:

[{"episodeNumber":100},{"episodeNumber":210}]

菲利斯·彼得斯(改进)

TheEpisode->TheNumbers->reduce(function ($result, $episode) {
          $episodeData = (collect())->put('episodeNumber', $episode['episodeNumber']);
          $result[] = $episodeData;
          return $result;
        }));

你想要“保留”哪个键?有点困惑。 - Mike Barwick
@MikeBarwick - episodeNumber 键 :) - rossanmol
然后你应该能够只需执行 ...->pluck('episodeID', 'episodeNumber'); - Mike Barwick
这将返回错误的输出。 - rossanmol
7个回答

46
Pluck() 可以接受两个参数,第二个参数指定了键名。 您可以这样做:
$TheEpisode->TheNumbers->pluck('episodeNumber', 'episodeID');

希望这能帮到你!


1
这很好,但我需要保留这个键。 - rossanmol
3
正是我需要的!! - Theodore R. Smith
1
再次救了我!正好是两年后的2020年10月25日! - Theodore R. Smith

10

尝试类似以下的代码,使用 map 应该可以正常工作...

return $TheEpisode->TheNumbers->map(function ($episode) {
    return ['episodeNumber' => $episode['episodeNumber']];
});

它可以工作!但是,我有多个episodeNumber,只显示了1个。 - rossanmol
这是我从你的代码中得到的输出: {"episodeNumber":210} - rossanmol

8

通过向pluck传递第二个参数即可轻松实现。从文档中可以看到:

您还可以指定希望如何将结果集合键入:

$plucked = $collection->pluck('name', 'product_id');

$plucked->all();

// ['prod-100' => 'Desk', 'prod-200' => 'Chair']

4
$collection->forget(['created_at', 'updated_at]);

这将简单地留下前两个键值对。需要记住的是:

forget 不会返回一个新的修改后的集合,它只是修改了它所调用的集合。

Laravel 文档

这应该可以正常工作:
$collection->only(['episodeID', 'episodeNumber']);

这个可以工作,但是这不是未来可持续的(如果我以后向我的数据库添加更多列,它们将被暴露)。 - rossanmol
4
请尝试这样做:$collection->only(['episodeID', 'episodeNumber']);该代码意思是筛选出 $collection 中仅包括 'episodeID' 和 'episodeNumber' 这两个属性。 - wujt

0
出于更新 Laravel 的考虑,我尝试了所有方法,并发现 return Model::get(['name','id']) 将返回具有 键值对 的简化结果。

0
尝试使用
$TheEpisode->TheNumbers->lists('episodeNumber');

关键将保持不变。


方法不存在。 - rossanmol
你确定你输入的是“lists”而不是“list”吗? - luke glenn jordan
都试过了。(我觉得在5.4中列表方法不存在) - rossanmol
哦,我明白了,在5.2中使用它,也许在5.4中不可用。 - luke glenn jordan

0

尝试像这样使用mapWithKeys

$TheEpisode->TheNumbers->mapWithKeys(function ($theNumber) {
return ['episodeNumber' => $theNumber['episodeNumber']
});

我猜你想要的结果是这样的:

"TheNumbers":['episodeNumber':100,'episodeNumber':210]


不行,这是不可能的,因为你重复了两次episodeName。我想要的是像原始想法一样,只有episodeName字段。 - rossanmol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接