У чому різниця між find (), findOrFail (), first (), firstOrFail (), get (), list (), toArray ()


107

У чому різниця між цими методами:

  1. find()
  2. findOrFail()
  3. first()
  4. firstOrFail()
  5. get()
  6. list()
  7. toArray()

Я використовую їх, і кожен з них дає різний результат, і іноді мені потрібно додати toArray()в кінці, get()оскільки моя функція очікує масив. Чи не будуть інші методи також створювати масиви?


1
Перегляньте документи Query Builder , а також посилання на Eloquent API .
Стюарт Вагнер,

Вся інформація від @Joseph Silber є правильною і дуже корисною. Я хочу додати відповідь до списку () із Laravel 5.2. Метод списку в об'єктах "Колекція", "Конструктор запитів" та "Красномовний конструктор запитів" було перейменовано на "вирвати". Підпис методу залишається незмінним.
Nirav Bhoi

Відповіді:


224
  1. find($id)приймає ідентифікатор і повертає одну модель. Якщо відповідна модель не існує, вона повертається null.

  2. findOrFail($id)приймає ідентифікатор і повертає одну модель. Якщо не існує відповідної моделі, вона видає помилку 1 .

  3. first()повертає перший запис, знайдений у базі даних. Якщо відповідна модель не існує, вона повертається null.

  4. firstOrFail()повертає перший запис, знайдений у базі даних. Якщо не існує відповідної моделі, вона видає помилку 1 .

  5. get() повертає колекцію моделей, що відповідають запиту.

  6. pluck($column)повертає колекцію лише значень у даному стовпці. У попередніх версіях Laravel цей метод називався lists.

  7. toArray() перетворює модель / колекцію в простий масив PHP.


Примітка: колекція - це поглиблений масив. Він функціонує подібно до масиву, але має багато додаткових функціональних можливостей, як ви можете бачити в документах .

На жаль, PHP не дозволяє використовувати об’єкт колекції скрізь, де можна використовувати масив. Наприклад, використання колекції в foreachциклі - це нормально, якщо передавати її в array_mapні, це не так. Подібним чином, якщо ви вкажете аргумент як array, PHP не дозволить вам передати йому колекцію. Починаючи з PHP 7.1, є натяк на iterableтип , який можна використовувати як для масивів, так і для колекцій.

Якщо ви коли-небудь захочете отримати звичайний масив із колекції, зателефонуйте його all()методу.


1 Помилка, викликана методами findOrFailand, firstOrFailє a ModelNotFoundException. Якщо ви самі не впіймаєте цей виняток, Laravel відповість 404 , саме цього ви хочете більшу частину часу.


1
Дякую за роз'яснення. Ось у чому річ, я намагаюся отримати список таких публікацій, $post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);щоб я міг отримати доступ, $post->subreddit->moderators->user_idале це дає Undefined property: Illuminate\Database\Eloquent\Collection::$user_id- я можу отримати доступ, $post->subreddit->moderatorsале не коли додав user_id- чому це?
Halnex

subredditє єдиною моделлю з moderatorsвластивістю. moderatorsце колекція, а не одна модель. Ви не можете отримати доступ ні до чого безпосередньо з нього. Ви можете перевірити перший, якщо хочете:$post->subreddit->moderators[0]->user_id
Джозеф Сільбер

Я думаю, вам слід замінити "він видає помилку" на "він видає виняток ModelNotFoundException": D У будь-якому випадку великий внесок;)
bobbybouwmann

@JosephSilber Ідеально!
bobbybouwmann 24.03.18
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.