Eloquent получает только один столбец в виде массива


87

Как получить только один столбец как один размерный массив в laravel 5.2, используя красноречие?

Я пытался:

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

но этот дает его как двухмерный массив, например:

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

но я хочу получить это как:

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

Ответы:


190

Вы можете использовать pluckметод:

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

Для получения дополнительной информации о том, какие методы доступны для использования с коллекцией, вы можете ознакомиться с документацией Laravel .


Спасибо, это была функция, которую я где-то видел, но больше не нашел, также для записи, чтобы ответ был правильным, затем, возможно, добавьте -> toArray (), поскольку он возвращает коллекцию в данный момент, а выбор можно не указывать из запроса для laravel 5.2 как минимум.
Riiwo

Верно насчет selectизбыточности, но я не вижу проблемы с получением коллекции в результате, потому что коллекция - это просто причудливый массив, который можно повторять так же, как массив. Я редко использую массивы вместо коллекций, так как объем памяти, как правило, не является проблемой, и коллекции можно легко преобразовать в массивы, где это необходимо, поскольку они реализуют toArrayметод. Однако для согласованности с вашим вопросом я изменил ответ, чтобы преобразовать результат.
Богдан

На данный момент я новичок в laravel и красноречивый, поэтому мне понадобились они как массив чисел, чтобы позже объединить массив с аналогичным и использовать его в другом запросе
Riiwo

Спасибо за то, что поделился этим!
Бхаргав Нанекалва

3
Хотя у a Collectionтакже есть pluck()метод - то, что вы используете, является методом QueryBuilder.
Пол Шпигель,

12

Если вы получаете несколько записей, правильный метод называется списками .

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

2
Потрясающе! lists()Отлично работает это сам. Спасибо.
moreirapontocom

1
Бум! Это прекрасно работает. Но не нужно использовать функцию toArray (), потому что lists () возвращает массив.
Sahan

1
lists()устарел в Laravel Ver.5.2 и более поздних версиях, где, pluck()как и в отмеченном ответе, это путь.
Маса Сакано

8

Вкратце это можно сделать так:

Model::pluck('column')

где модель - это модель, такая как Userмодель и столбец, как имя столбца, напримерid

если вы это сделаете

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

и, конечно, вы можете иметь любые другие предложения, такие как whereclause, прежде чем сорвать


6

Я столкнулся с этим вопросом и подумал, что уточню, что метод lists () красноречивого объекта-строителя был обесценен в Laravel 5.2 и заменен на 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();

Эти методы также могут быть вызваны в коллекции, например

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

-4

Я думаю, вы можете добиться этого, используя приведенный ниже код

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


Не могли бы вы это объяснить?
J ... S

1
Насколько мне известно, выполнение Model::get(['ColumnName'])->toArray();эквивалентно тому, Model::select('ColumnName')->get()->toArray()что в результате получается многомерный массив.
SamBremner 05
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.