微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 在Laravel中的数组和对象之间混淆

我正在学习Laravel,它使用OOPS概念.现在我发现很难理解数组和对象之间的真正区别.我实际上知道数组和对象是什么.

数组可以包含多个变量,其中对象是一个独立的实体,它有自己的参数和方法.我们通常使用foreach循环来遍历它们.

在laravel中,数据以模型实例的形式作为对象返回.当查询响应具有多个结果时,则以包含对象的数组的形式返回数据.我试图理解laravel中使用的Collection Class.

Codebright参考说

The Collection class itself, is merely a wrapper for an array of objects, but has a bunch of other interesting methods to help you pluck items out of the array.

现在回到我的困惑.我使用不同的方法,如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'];

我期待着箭头在这里工作

解决方法:

实际上,Collection类是一个包装器对象,它返回一组对象.例如,如果您有一个Model,例如User,那么您可以通过各种方式使用它,获取您可以使用User :: all()的所有记录,并获取您可以使用的单个记录User :: find(1)还有其他方法.

如果您使用all(),get()方法,那么您将获得一个集合对象,它表示在User模型上使用这些方法时的User模型集合并记住all()和get()始终返回一组模型即使其中只有一个型号,请检查以下内容

$users = User::all(); // returns a collection

您可以使用Collection对象的first()方法,如下所示:

$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’]的数组,但在这种情况下你可以使用两种语法,因为Laravel的Eloquent / Model实现了ArrayAccess(以及其他)接口,所以每个扩展Eloquent的模型都可以使用使用数组和对象语法来访问属性.所以,以下是可能的:

$user = User::where('username', 'me')->get();
return View::make('users.index')->with('user', $user);

在视图中,您可以使用:

{{ $user->name }}
{{ $user['name'] }}

为了更好地理解Collection类及其方法检查源代码,您可以在本地安装的vendor / laravel / framework / src / Illuminate / Database / Eloquent / Collection.PHP中找到它,并扩展Illuminate / Support / Collection. PHP类.检查两个班级.您也可以阅读this article,它会对您有所帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐