我学习Laravel并使用OOPS概念。现在我发现很难理解数组和对象之间的真正区别。我实际上知道数组和对象是什么。
Array可以包含多个变量,而对象是一个独立的实体,它有自己的参数和方法。我们通常使用foreach循环来遍历它们。
在laravel中,数据以模型实例的形式作为对象返回。当查询响应具有多个结果时,则以包含对象的数组的形式返回数据。我试图理解laravel中使用的Collection Class。
Codebright参考说
Collection类本身只是一个对象数组的包装器,但有一堆其他有趣的方法可以帮助你从数组中取出项目。
现在回到我的困惑中。我使用不同的方法,如all()
和first()
方法来获取结果。但有时当我使用箭头(->
)从一个对象(包含在一个数组中)中使用foreach循环获取数据时,它会显示一个错误,表明它是一个非对象。然后我用方括号显示数据。
我知道我们使用[]
从数组中获取数据,我们使用->
从对象中获取数据。但我仍然对Laravel感到困惑。有人可以在参考Laravel中使用的Collection类时明确说明它们之间的区别吗?
编辑::使用此代码时开始出现混乱:
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'];
我期待箭头在这里工作
答案 0 :(得分:19)
实际上Collection
类是一个包装对象,它返回一组对象。例如,如果您有一个模型,例如User
,那么您可以通过各种方式使用它,以获取您可能使用的所有记录User::all()
并获取您可能使用的单个记录{{1}还有其他方法。
如果您使用User::find(1)
,all()
方法,那么您将获得一个集合对象,这意味着当您在{{1}上使用这些方法时,get()
模型的集合} model并记住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()
在您看来,您可以使用:
{{$ user-&gt; email}}
您可以使用find(id)
使用对象(例如$user = user::find(1); // 1 is id for example
return View::make('users.index')->with('user', $user);
)和使用->
的数组,但在这种情况下,您可以使用这两种语法,因为$user->name
&#39; s $user['name']
实现Laravel
(以及其他)接口,因此可以使用扩展Eloquent/Model
的每个模型使用数组和对象语法来访问属性。所以,可以遵循:
ArrayAccess
在Eloquent
中,您可以使用:
$user = User::where('username', 'me')->get();
return View::make('users.index')->with('user', $user);
为了更好地理解view
类及其方法检查源代码,您可以在本地安装的{{ $user->name }}
{{ $user['name'] }}
找到它并扩展Collection
类。检查两个班级。您还可以阅读this article,它会为您提供更多帮助。
答案 1 :(得分:1)
我想我知道你问题的根源,因为我一直在努力解决它。如果您在模型对象上使用箭头符号并且关系中没有记录,那么您将获得&#34;非对象&#34;错误。例如,如果您有行
$student->school->school_name
并且给定的$student
没有school
个对象,您将获得非对象错误。我通常会添加empty($student->school)
或empty($student->school_id)
之类的支票,以便在我遇到它时避免这种情况(或者天堂禁止在进行初始编码传递时预见到问题)。
编辑:所以,澄清一下,Laravel没有说&#34;哦,那里有关系,所以school
是一个碰巧是空的对象,所以我&#39 ; ll为school_name
&#34;返回null,它表示&#34;没有school
,因此->school_name
是对对象属性的无效调用&#34;