Kan*_*nav 10 php arrays object laravel-4
我正在学习Laravel,它使用OOPS概念.现在我发现很难理解数组和对象之间的真正区别.我实际上知道数组和对象是什么.
数组可以包含多个变量,其中对象是一个独立的实体,它有自己的参数和方法.我们通常使用foreach循环来遍历它们.
在laravel中,数据以模型实例的形式作为对象返回.当查询响应具有多个结果时,则以包含对象的数组的形式返回数据.我试图理解laravel中使用的Collection Class.
Codebright参考说
Collection类本身只是一个对象数组的包装器,但有一堆其他有趣的方法可以帮助你从数组中取出项目.
现在回到我的困惑.我使用不同的方法all()和first()方法来获取结果.但有时当我使用arrow(->)从一个对象(包含在一个数组中)中使用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'];
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我使用方括号来获取数据(在最后一行).
$conversations_reply[] = $conversations_reply_obj['reply'];
Run Code Online (Sandbox Code Playgroud)
我期待着箭头在这里工作
The*_*pha 19
实际上,Collection该类是一个包装器对象,它返回一组对象.例如,如果您有一个模型,User那么您可以通过各种方式使用它,获取您可能使用的所有记录User::all()并获得您可能使用的单个记录User::find(1),还有其他方法.
如果您使用all(),get()方法,那么你会得到一个集合对象,这意味着集合User模型当你使用这些方法的User模型,并记住all()和get()总是返回的模型的集合,即使只有一个在它的模型,所以检查这个examaple :
$users = User::all(); // returns a collection
Run Code Online (Sandbox Code Playgroud)
您可以使用这样first()的Collection对象方法:
$users = User::all();
$users->first();
Run Code Online (Sandbox Code Playgroud)
或直接:
$user = User::first();
Run Code Online (Sandbox Code Playgroud)
您还可以使用last从集合中获取最后一个项目/模型.您也可以这样使用get():
$users = User::all();
$users = User::get(0) // to get first item/model
$users = User::get(1) // to get second item/model
Run Code Online (Sandbox Code Playgroud)
您也可以使用这样的循环:
$users = User::get(); // same as all
// pass the collection to the view
return View::make('users.index')->with('users', $users);
Run Code Online (Sandbox Code Playgroud)
现在在您的views/users/index.blade.php视图中,您可以使用如下循环:
@foreach($users as $user)
{{ $user->username }}<br />
{{ $user->email }}<br />
@endforeach
Run Code Online (Sandbox Code Playgroud)
这对没什么两样那么重要,all()并且get()方法返回一个集合,first()并find(id)返回一个模型对象,所以如果你有一个单一的模式,那么你可以直接使用它是这样的:
$user = user::find(1); // 1 is id for example
return View::make('users.index')->with('user', $user);
Run Code Online (Sandbox Code Playgroud)
在您的视图中,您可以使用:
{{$ user-> email}}
您可以使用->例如使用对象$user->name和使用数组,$user['name']但在这种情况下,您可以使用两种语法,因为它Laravel的Eloquent/Model实现ArrayAccess(以及其他)接口,因此Eloquent可以使用数组和对象语法来访问每个扩展的模型来访问属性.所以,以下是可能的:
$user = User::where('username', 'me')->get();
return View::make('users.index')->with('user', $user);
Run Code Online (Sandbox Code Playgroud)
在view你可以使用:
{{ $user->name }}
{{ $user['name'] }}
Run Code Online (Sandbox Code Playgroud)
为了更好地理解Collection类及其方法检查源代码,您可以在vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php本地安装中找到它并扩展Illuminate/Support/Collection.php类.检查两个班级.您也可以阅读这篇文章,它会对您有所帮助.