【问题标题】:Laravel - pluck mutated attributeLaravel - 采摘变异属性
【发布时间】:2017-02-06 20:48:08
【问题描述】:

我遇到了一个问题,确实只是一个小麻烦,但是...

基本上我需要的是一个用于选择框的关联数组。通常,这将使用pluck() 函数来实现。

问题是,我想用作“文本”的属性实际上并不存在于数据库中,它是一个将两个字段合二为一的mutator。

public function getNameAttribute() {
    return $this->first_name . ' ' . $this->last_name;
}

我知道将'name' 字段添加到模型上的$appends 数组将在将模型转换为数组时包含该字段,但这似乎不适用于pluck()

有没有一种简单的方法来实现我想要的?我缺少函数或声明?有什么比手动循环遍历集合并创建我自己的关联数组更有说服力的吗?

更新

我是个白痴。我正在传递一个数组来采摘而不是两个参数。显然 pluck 确实利用了$appends 属性。请注意,这仅在使用集合时有效:

$collection->pluck('mutatedValue', 'key');

不是查询生成器

$queryBuilder->pluck('mutatedValue', 'id');

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    我一直在寻找这个问题的答案,结果却得到了不同的结果,所以我想分享一下。

    User::get()->pluck('name');
    

    如果您首先获取对象,您的 mutated 属性将可以访问。

    【讨论】:

      【解决方案2】:

      您可以动态地将属性附加到集合中的对象:

      $users->each(function ($model) { $model->setAppends(['name']); });
      $users->pluck('name');
      

      这有一个很好的优势,即不需要 'name' 始终是您的数组数据的一部分,同时允许您的集合及时使用 name

      【讨论】:

      • 事实证明我根本不需要这样做,但到目前为止 +1 以获得一些优雅的答案。
      【解决方案3】:

      可以用 eloquent 查询并使用

      $limited_select = User::all(['id', 'first_name', 'last_name']);
      $limited_select = array_flip($limited_select);
      

      我假设您想尽可能阻止select *

      生成选择,您可以在刀片中执行以下操作:

      <select>
          @foreach($limited_select as $user)
              <option value={{$user->id}}> {{$user->getNameAttribute() }} </option>
          @endforeach
      </select>
      

      这会起作用,因为您的User Model 中的getNameAttribute() 将充当访问器。

      您的第二个选项可能是使用具有 concat 的原始查询,但我认为雄辩的方式更优雅。

      【讨论】:

      • 很遗憾,这不会提供我期望的结果。我正在寻找的模式是$array as $id =&gt; $name。您提供的内容将导致 $array as $index =&gt; $attributes 我仍然需要遍历集合并在使用它们之前修改结果。
      • array_flip 不适用于多维数组。每个$attributes 将是一个数组['first_name =&gt; 'Example', 'last_name' =&gt; 'Guy'] 测试这会导致以下错误array_flip(): Can only flip STRING and INTEGER values!
      【解决方案4】:

      您可以使用collection 方法,例如map()

      <?php
          // ...
      
          User::get()
              ->map(function($user) {
                  return [
                      'id'    => $user->id,
                      'text'  => $user->myCustomAttribute
                  ];
              })
              ->pluck('text', 'id')
              ->all(); 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-02
        相关资源
        最近更新 更多