2017-02-06 2 views
5

я столкнулся с проблемой, и это действительно лишь незначительные неудобства, но ...Laravel - срывать мутировали атрибут

В основном то, что мне нужно, это ассоциативный массив для выбора окна. Обычно это достигается с помощью функции pluck().

Проблема заключается в том, что атрибут, который я хочу использовать как «текст», фактически не существует в базе данных, это мутатор, который объединяет два поля в один.

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

Я знаю, что добавление 'name' поля в $appends массив на модели будет включать это поле при литье модели в массив, однако это не похоже на работу с pluck()

Есть простой способ для достижения желаемого я хочу? Функция или декларация отсутствует? Что-нибудь более красноречивое, чем ручная петля над коллекцией и создание моего собственного ассоциированного массива?

Обновление Я - идиот. Я передавал массив, чтобы вырвать вместо двух параметров. Очевидно, что pluck использует атрибут $appends. Обратите внимание, что это работает только при работе с коллекциями $collection->pluck('mutatedValue', 'key');НЕ построитель запросов $queryBuilder->pluck('mutatedValue', 'id');

Спасибо за помощь, ребята.

ответ

4

Вы можете динамически добавлять атрибут к объектам в вашей коллекции:

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

Это имеет хорошее преимущество, что не требует 'name' всегда быть частью ваших данных массивов, позволяя вашей коллекции использовать name только в время.

+0

Оказывается, мне не нужно было это делать в конце концов, но +1 до сих пор для немного элегантного ответа. –

1

Вы можете запросить с красноречивым и использовать

$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() внутри ваши User Model Виля действовать как аксессор.

Ваш второй вариант может использовать необработанный запрос, который имеет concat, но я думаю, что красноречивый способ более изящный.

+0

Это, к сожалению, не обеспечило ожидаемых результатов. Образец, который я ищу, это '' '$ array как $ id => $ name'''. То, что вы предоставили, приведет к '' '$ массиву как $ index => $ attributes''' Мне все равно нужно будет перебирать коллекцию и изменять результаты перед их использованием. –

+0

Хорошо переверните этот aray затем http://php.net/manual/en/function.array-flip.php :) –

+0

array_flip не будет работать с многомерными массивами. каждый '' '$ attributes''' будет массивом' '' ['first_name =>' Example ',' last_name '=>' Guy '] '' '' test, это приводит к следующей ошибке '' 'array_flip() : Можно только перевернуть значения STRING и INTEGER! '' ' –

1

Я искал ответ на этот вопрос и получил другой результат, поэтому я решил поделиться с вами.

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

Если вы сначала получите объект, ваш мутированный атрибут будет доступен.