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 ()
Джабер Аль Нахиан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.