Путаница между массивом и объектами в Laravel

Я изучаю 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 – недействительный вызов свойства объекта "