Eloquent erhalten nur eine Spalte als Array


84

Wie kann man in Laravel 5.2 mit eloquent nur eine Spalte als ein dimensionales Array erhalten?

Ich habe versucht:

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

aber dieser gibt es als 2 dimensionale Anordnung wie:

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

aber ich möchte es bekommen als:

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

Antworten:


181

Sie können die pluckMethode verwenden:

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

Weitere Informationen darüber, welche Methoden für die Sammlung verfügbar sind, finden Sie in der Laravel-Dokumentation .


Danke, das war die Funktion, die ich irgendwo gesehen habe, die ich aber nicht mehr gefunden habe, auch für die Aufzeichnung, damit die Antwort vorbestimmt ist. Fügen Sie dann vielleicht -> toArray () hinzu, da sie im Moment die Colletion zurückgibt und die Auswahl weggelassen werden kann aus der Abfrage für Laravel 5.2 mindestens.
Riiwo

Es stimmt, selectdass es redundant ist, aber ich sehe kein Problem damit, eine Sammlung zu haben, da eine Sammlung nur ein ausgefallenes Array ist, das über dasselbe wie ein Array iteriert werden kann. Ich verwende selten Arrays anstelle von Sammlungen, da der Speicherbedarf im Allgemeinen kein Problem darstellt und Sammlungen bei Bedarf einfach in Arrays umgewandelt werden können, da sie die toArrayMethode implementieren . Aus Gründen der Übereinstimmung mit Ihrer Frage habe ich die Antwort geändert, um das Ergebnis zu konvertieren.
Bogdan

Im Moment bin ich ziemlich neu in Laravel und beredt, also brauchte ich diese als Array von Zahlen, um das Array später mit einem ähnlichen zusammenzuführen und es in einer anderen Abfrage zu verwenden
Riiwo

Vielen Dank für das Teilen!
Bhargav Nanekalva

3
Während a Collectionauch eine pluck()Methode hat - Was Sie verwenden, ist eine Methode von QueryBuilder.
Paul Spiegel

12

Wenn Sie mehrere Einträge erhalten, heißt die richtige Methode Listen .

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

2
Genial! Das lists()funktioniert gut von selbst. Vielen Dank.
moreirapontocom

1
Boom! Das funktioniert perfekt. Sie müssen jedoch nicht die Funktion toArray () verwenden, da list () ein Array zurückgibt.
Sahan

1
lists()ist in Laravel Ver.5.2 und höher veraltet, wo pluck()wie in der getaggten Antwort der Weg ist.
Masa Sakano

7

Das kann in Kürze geschehen als:

Model::pluck('column')

Dabei ist Modell das Modell wie UserModell und Spalte als Spaltennameid

wenn Sie tun

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

& Natürlich können Sie auch andere Klauseln wie whereKlausel vor dem Zupfen haben


5

Ich bin auf diese Frage gestoßen und dachte, ich würde klarstellen, dass die list () -Methode eines beredten Builder-Objekts in Laravel 5.2 abgeschrieben und durch pluck () ersetzt wurde.

// <= 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();

Diese Methoden können beispielsweise auch für eine Sammlung aufgerufen werden

// <= 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');

-3

Ich denke, Sie können es erreichen, indem Sie den folgenden Code verwenden

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


Können Sie das bitte erklären?
J ... S

1
Soweit mir bekannt Model::get(['ColumnName'])->toArray();ist, entspricht Tun Model::select('ColumnName')->get()->toArray()dem Tun, was zu einem mehrdimensionalen Array führt.
SamBremner
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.