Laravel - 采用变异属性

时间:2017-02-06 20:48:09

标签: php laravel eloquent

我遇到了一个问题,这只是一个小小的不便,但是......

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

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

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

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

有没有一种简单的方法可以实现我想要的?我缺少的功能或声明?还有什么比手动循环集合并创建自己的关联数组更有说服力呢?

更新

我是个白痴。我正在传递一个数组来代替两个参数。显然,采用$appends属性。请注意,这仅适用于集合:

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

查询构建器

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

4 个答案:

答案 0 :(得分:12)

我一直在寻找答案,结果得到了不同的结果,所以我想我会分享。

function silly(i) {
  var localThis = this;
  function s(i) {
    if ( i < 1 ) // do something with localThis
    else return s( i-1 );
  }
  return s(i);
}

如果先获取对象,则可以访问mutated属性。

答案 1 :(得分:4)

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

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

这样做的好处是不需要'name'始终成为数组数据的一部分,同时允许您的集合及时使用name

答案 2 :(得分:1)

您可以使用eloquent查询并使用

parse-dashboard --appId yourAppId --masterKey yourMasterKey --serverURL https://example.com/parse --appName optionalName

我认为您希望在可能的情况下阻止$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> 内的getNameAttribute()会充当访问者。

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

答案 3 :(得分:0)

您可以使用collection之类的map()方法:

<?php
    // ...

    User::get()
        ->map(function($user) {
            return [
                'id'    => $user->id,
                'text'  => $user->myCustomAttribute
            ];
        })
        ->pluck('text', 'id')
        ->all(); 
相关问题