我遇到了一个问题,这只是一个小小的不便,但是......
基本上我需要的是一个选择框的关联数组。通常,这可以使用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');
答案 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();