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

时间:2014-04-06 18:11:26

标签: php arrays object laravel-4

我学习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'];

我期待箭头在这里工作

2 个答案:

答案 0 :(得分:19)

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

如果您使用User::find(1)all()方法,那么您将获得一个集合对象,这意味着当您在{{1}上使用这些方法时,get()模型的集合} model并记住UserUser总是返回一组模型,即使其中只有一个模型,所以请检查这个例子:

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;