2017-02-06 58 views
5

mam napotkasz problem, i to jest naprawdę tylko drobna niedogodność, ale ...laravel - oskubać zmutowane atrybut

Zasadniczo co potrzebne jest tablicą asocjacyjną dla wybranej skrzynki. Normalnie można to osiągnąć za pomocą funkcji pluck().

Problem polega na tym, że atrybut, którego chcę użyć jako "tekstu" w rzeczywistości nie istnieje w bazie danych, jest mutatorem, który łączy dwa pola w jeden.

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

wiem, że dodanie pola 'name' do tablicy $appends modelu obejmie to pole podczas odlewania model do tablicy, to jednak nie wydaje się, aby pracować z pluck()

Czy istnieje prosty sposób osiągnąć pragnienie, które chcę? Funkcja lub deklaracja, których mi brakuje? Czy jest coś bardziej elokwentnego niż ręczne zapętlenie kolekcji i tworzenie własnej tablicy skojarzonej?

Aktualizacja Jestem idiotą. Przekazałem tablicę do skubania zamiast dwóch parametrów. Najwyraźniej zrzucenie używa atrybutu $appends. Uwaga: działa to tylko w przypadku pracy z kolekcjamiNOT Konstruktor zapytań $queryBuilder->pluck('mutatedValue', 'id');

Dzięki za pomoc, chłopaki.

Odpowiedz

4

można dynamicznie dołączyć atrybut do obiektów w swojej kolekcji:

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

Ma to piękny zaletę, że nie wymaga 'name' zawsze będzie częścią danych tablicowych, pozwalając jednocześnie kolekcji używać name tylko w czas.

+0

Okazało się, że nie musiałem robić tego mimo wszystko, ale +1 do tej pory dla nieco eleganckiej odpowiedzi. –

1

Można zapytać o wymownym i używać

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

Przypuszczałem chciał zapobiec select * jeśli to możliwe.

generowania select można zrobić coś takiego w ostrza:

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

To działa, ponieważ getNameAttribute() wewnątrz swój czyn User Model wil jako akcesor.

Twoja druga opcja może używać surowego zapytania, które ma konkatencję, ale myślę, że wymowny sposób jest bardziej elegancki.

+0

To niestety nie zapewni oczekiwanych rezultatów. Wzór, którego szukam, to '' $ tablica jako $ id => $ name'''. To co podałeś spowoduje, że '' tablica $ będzie $ index => $ attributes''' Nadal potrzebowałbym pętli nad kolekcją i modyfikować wyniki przed ich użyciem. –

+0

Cofnij to aray następnie http://php.net/manual/en/function.array-flip.php :) –

+0

Funkcja array_flip nie działałaby z wielowymiarowymi tablicami. każdy "' '$ attributes''' będzie tablicą' '' ['first_name =>' Example ',' last_name '=>' Guy '] '' 'testowanie to skutkuje następującym błędem' '' array_flip() : Potrafi tylko odwracać wartości STRING i INTEGER! '' ' –

1

Szukałem odpowiedzi na to i zakończyłem z innym wynikiem, więc pomyślałem, że będę się dzielić.

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

Jeśli najpierw otrzymasz obiekt, twój zmutowany atrybut będzie dostępny.