2014-04-06 22 views
8

Tôi đang học Laravel và nó sử dụng khái niệm OOPS. Bây giờ tôi thấy khó hiểu được sự khác biệt thực sự giữa mảng và đối tượng. Tôi thực sự biết một mảng và đối tượng là gì.Nhầm lẫn giữa mảng và đối tượng trong Laravel

Mảng có thể chứa nhiều hơn một biến khi đối tượng là thực thể độc lập có đối số và phương pháp riêng. Chúng ta thường sử dụng vòng lặp foreach để lặp qua chúng.

Trong laravel, dữ liệu được trả về dưới dạng ví dụ mẫu làm đối tượng. Khi đáp ứng truy vấn có nhiều kết quả, thì dữ liệu được trả về dưới dạng một mảng chứa các đối tượng. Tôi đã cố gắng hiểu Class Collection được sử dụng trong laravel.

Codebright tham khảo nói

Lớp sưu tập riêng của mình, chỉ đơn thuần là một wrapper cho một mảng của các đối tượng, nhưng có một loạt các phương pháp thú vị khác để giúp bạn nhổ mục ra khỏi mảng.

Bây giờ trở lại sự nhầm lẫn của tôi. Tôi đã sử dụng các phương pháp khác nhau như các phương pháp all()first() để tìm nạp kết quả. Nhưng đôi khi khi tôi sử dụng mũi tên (->) để tìm nạp dữ liệu bằng cách sử dụng vòng lặp foreach, từ một đối tượng (chứa trong một mảng), nó cho thấy một lỗi nói rằng một cái gì đó giống như nó là một đối tượng không. Sau đó, tôi đã sử dụng dấu ngoặc vuông và dữ liệu được hiển thị.

Tôi biết chúng tôi sử dụng [] để tìm nạp dữ liệu từ mảng và chúng tôi sử dụng -> để tìm nạp dữ liệu từ các đối tượng. Nhưng tôi vẫn còn bối rối về Laravel. Có thể ai đó nêu rõ sự khác biệt giữa chúng trong tham chiếu đến lớp Collection được sử dụng trong Laravel?

Sửa :: Sự rắc rối bắt đầu khi sử dụng mã này:

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']; 
} 

Như bạn thấy, tôi đã sử dụng dấu ngoặc vuông để lấy dữ liệu (ở dòng cuối cùng).

$conversations_reply[] = $conversations_reply_obj['reply']; 

tôi đã mong mũi tên để làm việc ở đây

Trả lời

17

Trên thực tế các lớp Collection là một đối tượng wrapper mà trả về một bộ sưu tập của các đối tượng. Ví dụ: nếu bạn có Mẫu, ví dụ: User thì bạn có thể sử dụng theo nhiều cách khác nhau để có được tất cả các bản ghi mà bạn có thể sử dụng User::all() và để có được một bản ghi duy nhất bạn có thể sử dụng User::find(1) và cũng có các cách khác.

Nếu bạn sử dụng all(), get() phương pháp sau đó bạn sẽ nhận được một đối tượng bộ sưu tập, nó có nghĩa là một tập hợp các mô hình User khi bạn sử dụng những phương pháp trên User mô hình và nhớ all()get() luôn trả về một bộ sưu tập các mô hình thậm chí nếu có chỉ có một mô hình trong nó, vì vậy kiểm tra examaple này:

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

Bạn có thể sử dụng phương pháp first()Collection đối tượng như thế này:

$users = User::all(); 
$users->first(); 

Hoặc trực tiếp chỉ:

$user = User::first(); 

Bạn cũng có thể sử dụng last để có được những mục cuối cùng/mô hình từ bộ sưu tập. Bạn cũng có thể sử dụng get() như thế này:

$users = User::all(); 
$users = User::get(0) // to get first item/model 
$users = User::get(1) // to get second item/model 

Bạn cũng có thể sử dụng một vòng lặp như thế này:

$users = User::get(); // same as all 
// pass the collection to the view 
return View::make('users.index')->with('users', $users); 

Bây giờ trong views/users/index.blade.php nhìn của bạn, bạn có thể sử dụng một vòng lặp như thế này:

@foreach($users as $user) 
    {{ $user->username }}<br /> 
    {{ $user->email }}<br /> 
@endforeach 

Điều quan trọng là phải knoe rằng, all()get() phương thức trả về một bộ sưu tập và first()find(id) retur ns một đối tượng mô hình duy nhất, vì vậy nếu bạn có một mô hình duy nhất sau đó bạn có thể trực tiếp sử dụng nó như thế này:

$user = user::find(1); // 1 is id for example 
return View::make('users.index')->with('user', $user); 

Theo quan điểm của bạn, bạn có thể sử dụng:

{{$ user-> email}}

bạn có thể sử dụng một đối tượng sử dụng -> ví dụ $user->name và một mảng sử dụng $user['name'] nhưng trong trường hợp này bạn có thể sử dụng cả hai cú pháp vì Laravel 's Eloquent/Model cụ ArrayAccess (cùng với những người khác) giao diện như vậy mỗi mô hình mà kéo dài Eloquent thể được sử dụng chúng ing cả mảng và đối tượng cú pháp để truy cập các thuộc tính. Vì vậy, sau đây là có thể:

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

Trong view bạn có thể sử dụng:

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

Để hiểu rõ hơn về các lớp Collection và nó là phương pháp kiểm tra mã nguồn, bạn có thể tìm thấy nó ở vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php của bạn cài đặt cục bộ và nó mở rộng Illuminate/Support/Collection.php lớp học. Kiểm tra cả hai lớp. Bạn cũng có thể đọc this article, nó sẽ giúp bạn nhiều hơn.

1

Tôi nghĩ rằng tôi biết nguồn gốc của vấn đề của bạn, vì tôi đã phải làm việc xung quanh nó. Nếu bạn đang sử dụng ký hiệu mũi tên trên một đối tượng mô hình và không có bản ghi nào trong mối quan hệ, thì bạn sẽ nhận được lỗi "không đối tượng". Ví dụ, nếu bạn có dòng

$student->school->school_name 

và trao $student không có một đối tượng school, bạn sẽ nhận được lỗi phi vật thể.Tôi thường thêm kiểm tra cho empty($student->school) hoặc empty($student->school_id) hoặc tương tự để tránh điều này khi tôi gặp phải sự cố đó (hoặc thiên đường cấm xem sự cố khi thực hiện mã hóa mã hóa ban đầu của tôi).

EDIT: Vì vậy, để làm rõ, Laravel không nói "oh, có một mối quan hệ ở đó, vì vậy school là một đối tượng mà sẽ xảy ra để trống, vì vậy tôi sẽ trả về null cho school_name", nó nói "không có school, vì vậy ->school_name là cuộc gọi không hợp lệ đối với thuộc tính đối tượng "

+0

Bạn có quản lý để giải quyết sự cố của mình không? – dspitzle