Eloquent pobiera tylko jedną kolumnę jako tablicę

89

Jak uzyskać tylko jedną kolumnę jako jedną tablicę wymiarową w Laravel 5.2 przy użyciu elokwentu?

Próbowałem:

$array = Word_relation::select('word_two')->where('word_one', $word_id)->get()->toArray();

ale ta daje to jako 2-wymiarową tablicę, taką jak:

array(2) {
      [0]=>
      array(1) {
        ["word_one"]=>
        int(2)
      }
      [1]=>
      array(1) {
        ["word_one"]=>
        int(3)
      }
    }

ale chcę to uzyskać jako:

array(2) {
    [0]=>2
    [1]=>3
}
Riiwo
źródło

Odpowiedzi:

192

Możesz użyć pluckmetody:

Word_relation::where('word_one', $word_id)->pluck('word_two')->toArray();

Aby uzyskać więcej informacji na temat dostępnych metod korzystania z kolekcji, możesz zapoznać się z dokumentacją Laravel .

Bogdana
źródło
Dzięki, to była funkcja, którą gdzieś widziałem, ale już jej nie znalazłem, także dla rekordu, aby odpowiedź była presice, to może dodaj -> toArray (), ponieważ zwraca kolekcję w tej chwili i zaznacz można pominąć przynajmniej z zapytania o laravel 5.2.
Riiwo
To prawda, że selectjest nadmiarowy, ale nie widzę problemu z uzyskaniem w rezultacie kolekcji, ponieważ kolekcja jest po prostu fantazyjną tablicą, którą można iterować tak samo jak tablicę. Rzadko używam tablic zamiast kolekcji, ponieważ ślad pamięci generalnie nie stanowi problemu, a kolekcje można łatwo rzutować na tablice w razie potrzeby, ponieważ implementują toArraymetodę. Jednak aby zachować spójność z Twoim pytaniem, zmodyfikowałem odpowiedź, aby przekonwertować wynik.
Bogdan
W tej chwili jestem całkiem nowy w laravel i elokwentny, więc potrzebowałem ich jako tablicy liczb, aby później połączyć tablicę z podobną i użyć jej w innym zapytaniu
Riiwo
Dziękuję za udostępnienie tego!
Bhargav Nanekalva
3
Chociaż a Collectionma również pluck()metodę - to, czego używasz, jest metodą QueryBuilder.
Paul Spiegel,
12

Jeśli otrzymasz wiele wpisów, właściwą metodą jest lista .

    Word_relation::select('word_two')->where('word_one', $word_id)->lists('word_one')->toArray();
moxx
źródło
2
Niesamowite! lists()Działa dobrze przez to samo. Dziękuję Ci.
moreirapontocom
1
Bum! To działa doskonale. Ale nie trzeba używać funkcji toArray (), ponieważ list () zwraca tablicę.
Sahan,
1
lists()jest przestarzały w Laravel w wersji 5.2 i nowszych, gdzie pluck()zgodnie z oznaczoną odpowiedzią jest droga.
Masa Sakano
8

Można to zrobić w skrócie:

Model::pluck('column')

gdzie model jest modelem, takim jak Usermodel i kolumna jako nazwa kolumnyid

Jeśli zrobisz

User::pluck('id') // [1,2,3, ...]

i oczywiście możesz mieć dowolne inne klauzule, takie jak whereklauzula przed zerwaniem

APu
źródło
6

Natknąłem się na to pytanie i pomyślałem, że wyjaśnię, że metoda list () elokwentnego obiektu budowniczego została zdeprecjonowana w Laravel 5.2 i zastąpiona przez pluck ().

// <= Laravel 5.1
Word_relation::where('word_one', $word_id)->lists('word_one')->toArray();
// >= Laravel 5.2
Word_relation::where('word_one', $word_id)->pluck('word_one')->toArray();

Te metody można również wywołać na przykład w kolekcji

// <= Laravel 5.1
  $collection = Word_relation::where('word_one', $word_id)->get();
  $array = $collection->lists('word_one');

// >= Laravel 5.2
  $collection = Word_relation::where('word_one', $word_id)->get();
  $array = $collection->pluck('word_one');
SamBremner
źródło
-4

Myślę, że możesz to osiągnąć za pomocą poniższego kodu

Model::get(['ColumnName'])->toArray();

saeid
źródło
Czy możesz to wyjaśnić.
J ... S
1
O ile wiem, robienie tego Model::get(['ColumnName'])->toArray();jest równoważne robieniu, Model::select('ColumnName')->get()->toArray()które skutkuje wielowymiarową tablicą.
SamBremner,