Sự khác biệt giữa find (), findOrFail (), first (), firstOrFail (), get (), list (), toArray ()


109

Sự khác biệt giữa các phương pháp này là gì:

  1. find()
  2. findOrFail()
  3. first()
  4. firstOrFail()
  5. get()
  6. list()
  7. toArray()

Tôi đã sử dụng chúng và mỗi cái cho một kết quả khác nhau và đôi khi tôi cần thêm toArray()vào cuối get()vì hàm của tôi đang mong đợi một mảng. Các phương thức khác sẽ không tạo ra mảng phải không?


1
Hãy xem tài liệu của Trình tạo truy vấn , cũng như tài liệu tham khảo Eloquent API .
Stuart Wagner

Tất cả thông tin từ @Joseph Silber đều đúng và rất hữu ích. Tôi muốn thêm câu trả lời vào list () Từ Laravel 5.2 Phương thức danh sách trên các đối tượng Bộ sưu tập, trình tạo truy vấn và Trình tạo truy vấn Eloquent đã được đổi tên thành pluck. Chữ ký phương thức vẫn giữ nguyên.
Nirav Bhoi,

Câu trả lời:


226
  1. find($id)lấy một id và trả về một mô hình duy nhất. Nếu không tồn tại mô hình phù hợp, nó sẽ trả về null.

  2. findOrFail($id)lấy một id và trả về một mô hình duy nhất. Nếu không có mô hình phù hợp nào tồn tại, nó sẽ gây ra lỗi 1 .

  3. first()trả về bản ghi đầu tiên được tìm thấy trong cơ sở dữ liệu. Nếu không tồn tại mô hình phù hợp, nó sẽ trả về null.

  4. firstOrFail()trả về bản ghi đầu tiên được tìm thấy trong cơ sở dữ liệu. Nếu không có mô hình phù hợp nào tồn tại, nó sẽ gây ra lỗi 1 .

  5. get() trả về một tập hợp các mô hình phù hợp với truy vấn.

  6. pluck($column)trả về một tập hợp chỉ các giá trị trong cột đã cho. Trong các phiên bản trước của Laravel, phương thức này đã được gọi lists.

  7. toArray() chuyển đổi mô hình / bộ sưu tập thành một mảng PHP đơn giản.


Lưu ý: một tập hợp là một mảng được tăng cường. Nó hoạt động tương tự như một mảng, nhưng có nhiều chức năng bổ sung, như bạn có thể thấy trong tài liệu .

Thật không may, PHP không cho phép bạn sử dụng đối tượng bộ sưu tập ở mọi nơi bạn có thể sử dụng một mảng. Ví dụ, sử dụng một tập hợp trong một foreachvòng lặp là được, nhưng chuyển nó vào array_mapthì không. Tương tự, nếu bạn gõ-gợi ý một đối số là array, PHP sẽ không cho phép bạn chuyển nó vào một tập hợp. Bắt đầu từ PHP 7.1, có iterabletypehint , có thể được sử dụng để chấp nhận cả mảng và tập hợp.

Nếu bạn muốn lấy một mảng thuần túy từ một tập hợp, hãy gọi all()phương thức của nó .


1 Lỗi do findOrFailfirstOrFailcác phương thức là a ModelNotFoundException. Nếu bạn không tự mình nắm bắt được ngoại lệ này, Laravel sẽ trả lời bằng 404 , đây là điều bạn muốn hầu hết thời gian.


1
Cảm ơn bạn đã làm sáng tỏ. Đây là vấn đề, tôi đang cố gắng lấy danh sách các bài đăng như thế này $post = Post::with('user.votes')->with('subreddit.moderators')->findOrFail($post->id);để tôi có thể truy cập $post->subreddit->moderators->user_idnhưng điều đó đang cho phép Undefined property: Illuminate\Database\Eloquent\Collection::$user_id- tôi có thể truy cập $post->subreddit->moderatorsnhưng không thể truy cập khi tôi thêm user_id- tại sao vậy?
Halnex

subredditlà một mô hình duy nhất, với một thuộc moderatorstính. moderatorslà một bộ sưu tập, không phải là một mô hình duy nhất. Bạn không thể truy cập bất cứ thứ gì trực tiếp từ nó. Bạn có thể kiểm tra đầu tiên nếu bạn muốn:$post->subreddit->moderators[0]->user_id
Joseph Silber

Tôi nghĩ bạn nên thay thế "nó ném một lỗi" với "nó ném một ngoại lệ ModelNotFoundException": D góp Dù sao lớn;)
bobbybouwmann

@JosephSilber Hoàn hảo!
bobbybouwmann
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.