Eloquent ORM laravel 5 получить массив идентификаторов

87

Я использую Eloquent ORM laravel 5.1, я хочу вернуть массив идентификаторов больше 0, моя модель называется test.

Я пытался :

$test=test::select('id')->where('id' ,'>' ,0)->get()->toarray();

Он возвращается:

Array ( [0] => Array ( [id] => 1 ) [1] => Array ( [id] => 2 ) )

Но я хочу, чтобы результат был в виде простого массива, например:

Array ( 1,2 )
параноик
источник

Ответы:

213

Вы можете использовать lists():

test::where('id' ,'>' ,0)->lists('id')->toArray();

ПРИМЕЧАНИЕ. Лучше, если вы определите свои модели в Studly Caseформате, например Test.


Вы также можете использовать get():

test::where('id' ,'>' ,0)->get('id');

ОБНОВЛЕНИЕ: (Для версий> = 5.2)

В новых версиях этот lists()метод устарел>= 5.2 , теперь pluck()вместо него можно использовать метод:

test::where('id' ,'>' ,0)->pluck('id')->toArray();

ПРИМЕЧАНИЕ. Если вам нужна строка , например, в лезвии , вы можете использовать функцию без части toArray () , например:

test::where('id' ,'>' ,0)->pluck('id');
Закария Ачарки
источник
3
с pluck ('id') массивом является array ('0' => 12, '1' => 14) и т.д., при использовании в WhereIn ('id', $ array) он выбирает не по идентификатору, а по массиву key, so by 0,1 ...
Gediminas
2
toArray()должен вернуть массив вроде[12,14]
Закария Ачарки
1
о да, вы правы, я отлаживал через Debugbar ant print_r, и оба они показывали значения массивов с ключами, но ключей нет. Спасибо!
Gediminas
Мы застряли на 4.2 для одного проекта, поэтому я ценю сохранение ссылки -> lists ('id'). Хотя это сгенерировало массив напрямую, не нужно было -> toArray его.
Дастин Грэм
18

Из a Collection, вы могли бы сделать это по-другому:

$collection->pluck('id')->toArray()

Это вернет индексированный массив, который, например, отлично может использовать laravel в whereIn()запросе.

Джордж
источник
2
Также используется для выпадающего списка.
Бира
Чтобы получить коллекцию для извлечения из модели \YourModel::all(['id'])... ->pluck...(указав только столбец идентификатора, вы не загружаете все данные в модель)
jave.web
5

Правильный ответ на этот вопрос - метод lists, он очень прост:

$test=test::select('id')->where('id' ,'>' ,0)->lists('id');

С уважением!

Радамес Э. Эрнандес
источник
Как бы вы получили список связанных идентификаторов в массиве через отношения "многие ко многим"?
Pathros
Возможно, вы можете использовать класс DB, например: DB :: table ('name_of_table') -> where ('condition') -> lists ('id');
Радамес Э. Эрнандес
5

Вы можете использовать all()метод вместо toArray()метода (подробнее см .: документация laravel ):

test::where('id' ,'>' ,0)->pluck('id')->all(); //returns array

При необходимости stringможно использовать без toArray()вложения:

test::where('id' ,'>' ,0)->pluck('id'); //returns string
Мехмет Бютюн
источник
4

прочитать о методе lists ()

$test=test::select('id')->where('id' ,'>' ,0)->lists('id')->toArray()
Амир Бар
источник
когда я использую in_array_command в файле лезвия, показывает эту ошибку. > in_array () ожидает, что параметр 2 будет массивом, заданным объектом
параноик
о, теперь я понял, вам нужно вызвать toArray (), lists () return collection
Амир Бар
1

Дополнительная информация, если вы используете DB:

DB::table('test')->where('id', '>', 0)->pluck('id')->toArray();

А если использовать модель Eloquent:

test::where('id', '>', 0)->lists('id')->toArray();
Махмуд Мостафа
источник
0

Хотя вы отметили ответ, это гораздо более простой подход

App\User::pluck('id')->toArray()
врач
источник
-2

Вы также можете использовать метод all () для получения массива выбранных атрибутов.

$test=test::select('id')->where('id' ,'>' ,0)->all();

С уважением

Нарендра Оджха
источник
1
Не работает. В нем говорится: «Вызов неопределенного метода» Illuminate \ Database \ Query \ Builder :: all ()
Джабер Аль Нахиан