Я изучаю Laravel и использует концепции OOPS. Теперь мне трудно понять реальную разницу между массивом и объектами. Я действительно знаю, что такое массив и объект.
Массив может содержать более одной переменной, где, поскольку объект является независимым объектом, который имеет свои собственные аргументы и методы. Обычно мы используем цикл foreach для их прокрутки.
В laravel данные возвращаются в виде экземпляра модели как объекта. Когда ответ запроса имеет несколько результатов, данные возвращаются в виде массива, который содержит объекты. Я пытался понять класс коллекций, используемый в laravel.
Ссылка Codebright говорит
Сам класс Collection – это всего лишь оболочка для массива объектов, но имеет множество других интересных методов, которые помогут вам вырвать элементы из массива.
Теперь вернемся к моему смущению. Для получения результата я использовал разные методы, такие как методы all()
и first()
. Но иногда, когда я использовал стрелку ( ->
) для извлечения данных с использованием цикла foreach, из объекта (содержащегося в массиве), он обнаружил ошибку, которая говорит, что что-то вроде не-объекта. Затем я использовал квадратные скобки, и данные были отображены.
Я знаю, что мы используем []
для извлечения данных из массивов, и мы используем ->
для извлечения данных из объектов. Но я все еще путаюсь о Ларавеле. Может ли кто-то четко указать разницу между ними в отношении класса Collection, используемого в Laravel?
Изменить :: Начался путаница при использовании этого кода:
foreach($self_conversations as $self_conversations_fetch){ //fetching each conversation id $conversation_id = Conversation::find($self_conversations_fetch->conversation_id); $user_id = array(); //fetching each conversation member's id foreach($conversation_id->conversationsMember as $conversationmembers) $user_id[] = $conversationmembers->user_id; $self_id = User::where('email', Session::get('email'))->first()->id; $self_id_array = array($self_id); $friend_id_array = array_diff($user_id, $self_id_array); foreach($friend_id_array as $friend_id) array_push($friend_ids, $friend_id); $conversations_reply_obj = ConversationReply::where('conversation_id', $self_conversations_fetch->conversation_id)->orderBy('updated_at', 'desc')->first(); $conversations_reply[] = $conversations_reply_obj['reply']; }
Как вы можете видеть, я использовал квадратные скобки для извлечения данных (в последней строке).
$conversations_reply[] = $conversations_reply_obj['reply'];
я ожидал, что стрелка будет работать здесь
На самом деле класс Collection
является объектом-оболочкой, который возвращает коллекцию объектов. Например, если у вас есть Модель, например, User
то вы можете использовать ее различными способами, чтобы получить все записи, которые вы можете использовать User::all()
и для получения одной записи вы можете использовать User::find(1)
и есть и другие способы.
Если вы используете методы all()
, get()
вы получите объект коллекции, это означает коллекцию моделей User
когда вы используете эти методы в модели User
и помните, что all()
и get()
всегда возвращают коллекцию моделей даже если в нем есть только одна модель, поэтому проверьте этот пример:
$users = User::all(); // returns a collection
Вы можете использовать метод first()
объекта Collection
следующим образом:
$users = User::all(); $users->first();
Или прямо:
$user = User::first();
Вы также можете использовать last
чтобы получить последний элемент / модель из коллекции. Вы также можете использовать get()
следующим образом:
$users = User::all(); $users = User::get(0) // to get first item/model $users = User::get(1) // to get second item/model
Вы также можете использовать такой цикл:
$users = User::get(); // same as all // pass the collection to the view return View::make('users.index')->with('users', $users);
Теперь в views/users/index.blade.php
вы можете использовать такой цикл:
@foreach($users as $user) {{ $user->username }}<br /> {{ $user->email }}<br /> @endforeach
Важно знать, что методы all()
и get()
возвращают коллекцию и first()
а find(id)
возвращает один объект модели, поэтому, если у вас есть одна модель, вы можете напрямую ее использовать следующим образом:
$user = user::find(1); // 1 is id for example return View::make('users.index')->with('user', $user);
На ваш взгляд, вы можете использовать:
{{$ user-> email}}
Вы можете использовать объект, используя ->
например $user->name
и массив, используя $user['name']
но в этом случае вы можете использовать оба синтаксиса, потому что Eloquent/Model
Laravel
реализует ArrayAccess
(наряду с другими) поэтому каждая модель, которая расширяет Eloquent
может использоваться с использованием как синтаксиса массива, так и объекта для доступа к свойствам. Итак, возможно следующее:
$user = User::where('username', 'me')->get(); return View::make('users.index')->with('user', $user);
В view
вы можете использовать:
{{ $user->name }} {{ $user['name'] }}
Для лучшего понимания класса Collection
и его методов проверьте исходный код, вы можете найти его у vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php
вашей локальной установки, и он расширяет Illuminate/Support/Collection.php
. Проверьте оба класса. Вы также можете прочитать эту статью , это поможет вам больше.
Я думаю, что знаю источник вашей проблемы, поскольку мне приходится ее обходить. Если вы используете нотацию стрелки на объекте модели, и в этой связи нет записи, вы получите ошибку «не-объект». Например, если у вас есть линия
$student->school->school_name
и у данного $student
нет school
объекта, вы получите ошибку, отличную от объекта. Обычно я добавляю чеки для empty($student->school)
или empty($student->school_id)
или тому подобное, чтобы избежать этого, когда я натыкаюсь на него (или не дай бог, если у меня возникла проблема при выполнении моего начального прохода кодирования).
EDIT: Итак, чтобы прояснить, Laravel не говорит «о, там есть отношения, поэтому school
– это объект, который бывает пустым, поэтому я school_name
null для имени school_name
», он говорит: «Нет school
, поэтому ->school_name
– недействительный вызов свойства объекта "