【问题标题】:Need to create collection of keys with multiple values (Laravel 7.x)需要创建具有多个值的键集合(Laravel 7.x)
【发布时间】:2020-09-13 12:01:01
【问题描述】:

我在这里的第一篇文章。我试图寻找答案,但没有运气,所以我们开始

一般来说,我无法与您分享我正在处理的确切代码:( 所以这里是一个例子:

$collection = collect(['country' => 'Germany', 'city' => 'Berlin', 'month' => 'April']);
dd($collection);
//"country" => "Germany"
//"city" => "Berlin"
//"month" => "April"
$array1 = ['France', 'Paris', 'May'];
$array2 = ['Spain', 'Madrid', 'June'];

我的问题是 - 如何“添加”这些数组(注意数组 1 和数组 2 的顺序)所以我最终会得到这样的结果?

dd($newCollection);
//output:
//"country" => ["Germany", "France", "Spain"]
//"city" => ["Berlin", "Paris", "Madrid"]
//"month" => ["April", "May", "June"]

如果有办法从数据库中获取所有记录,并将其中一行作为键并将它们的选择作为值

例子

$users = User::get();
//this table has columns "full_name", "e-mail", "job", "birth_date", "city" and "password"
$collection = <<???>> //make column "full_name" as key and columns "e-mail", "job", "password" as values
dd($collection);
//output:
//"John Doe" => ["johndoe@mail.com", "Janitor", "topsecret"]
//"Jane Doe" => ["janedoe@mail.com", "teacher", "sercretpassword"]

终生感谢您的回答...我已经多次阅读 Laravel 的文档,但找不到解决方案

【问题讨论】:

  • 这似乎有点毫无意义。如果您通过User::get() 获取所有$users,那么每个$user(给定循环foreach($users as $user))将包含所有这些信息,$user-&gt;full_name$user-&gt;email$user-&gt;job$user-&gt;password。除非您需要特定格式 'full_name' =&gt; ['email', 'job', 'password'],否则要获得您已经拥有的内容是额外的工作。
  • 另外,旁注,请确保您的数据库中的password 列不是明文。如果您在 users 表中存储了未经哈希处理的 password 版本,这是一个巨大的安全漏洞。
  • 这只是一个例子,所有密码都经过哈希处理;)感谢您的回答,我想我知道如何解决这个问题了!
  • 优秀:) 我希望如此,只是一个确认。如果您提出解决方案,请随时将其发布为自我回答;将来可能会对其他人有所帮助。干杯!
  • 为什么不 "full_name" = $users->pluck('full_name') ;等等……

标签: arrays laravel collections eloquent


【解决方案1】:

我有这个

我的解决方案是这样的:

$users = User::get();
//this table has columns "id", "full_name", "e-mail", "job", "birth_date", "city" and "password"

//I don't want to use all columns here
foreach($users as $user=>$value){
    $full_name = $value->full_name;
    $e-mail = $value->e-mail;
    $job = $value->job;
    $password -> $value->password;
    $endresult[] = [$full_name, $e-mail, $job, $password];
}

$collection = collect($users->keyBy('id')->pluck('id'))->combine($endresult);
dd($collection);
//output:
// 1 => ["John Doe", "johndoe@mail.com", "Janitor", "topsecret"]
// 2 => ["Jane Doe", "janedoe@mail.com", "teacher", "sercretpassword"]

它看起来很糟糕,但就像一个魅力。我需要像这样格式化它,因为在我的项目中有很多外键,我需要分页我的结果,所以为了使其成为最简单的方法,我需要将所有值组合到一个键(就像 csv 中的一行)而不是而不是调用视图中的每个值

感谢您的支持

【讨论】:

    【解决方案2】:

    从技术上讲,您在这里问了两个问题。一种是您将一组值合并到一个键值集合中,另一种是您只需通过 ID 限制一组键值集合中的值和键。

    鉴于您确实在寻找第二个问题的答案,通过您的答案,这是一种更简洁的方法:

    User::select('id', 'full_name', 'email', 'job', 'password')
      ->get()
      ->keyBy('id')
      ->map(function($user) {
        return collect($user)->except('id');
      });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多