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
}
Riiwo
источник

Ответы:

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();
moxx
источник
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, прежде чем сорвать

APu
источник
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');
SamBremner
источник
-4

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

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

Саид
источник
Не могли бы вы это объяснить?
J ... S
1
Насколько мне известно, выполнение Model::get(['ColumnName'])->toArray();эквивалентно тому, Model::select('ColumnName')->get()->toArray()что в результате получается многомерный массив.
SamBremner 05