Laravel Eloquent lấy tất cả các bản ghi theo id

Có những trường hợp bạn cần lấy mảng ID cho một số bản ghi trong bộ sưu tập/bảng. Tôi sẽ chỉ cho bạn hai cách nhanh chóng để làm điều đó - một cách khá phổ biến và một cách khác là một chức năng mà tôi chỉ mới tìm ra hôm nay

Hãy tưởng tượng rằng bạn có mối quan hệ hasMany() - một Vai trò có nhiều Quyền. Và sau đó bạn cần lấy ID quyền theo một vai trò nhất định

Mã điển hình để làm điều này sẽ có chức năng pull()

// returns array of IDs
$permissionIDs = $role->permissions->pluck('id'); 

Nhưng nếu tên khóa chính tăng tự động của bạn không phải là "id" thì sao?

// Same result as above. Even same character count :)
$permissionIDs = $role->permissions->modelKeys();

Mô tả chính thức của phương thức modelKeys() khá ngắn. "Lấy mảng khóa chính. "

Lưu ý rằng, như tôi đã nói trước đây, nó hoạt động trên Bộ sưu tập, không chỉ trên mô hình Laravel. Vì vậy, phương thức nhổ() tồn tại cho cả Mô hình và Bộ sưu tập, vì vậy cả hai sẽ hoạt động

$allPermissions = Permission::pluck('id');
$permissions = $role->permissions->pluck('id');

Nhưng trong trường hợp modelKeys(), điều này sẽ thất bại với lỗi "Gọi đến phương thức không xác định App\Models\Permission. modelKeys()"

$allPermissions = Permission::modelKeys();

Cách giải quyết là đưa tất cả kết quả vào Bộ sưu tập rồi lấy khóa

$allPermissions = Permission::all()->modelKeys();

Nhưng nó có thể gây ra các vấn đề về hiệu suất nếu bạn nhận được tất cả các bản ghi cho bảng lớn

Vì vậy, chỉ là một mẹo nhanh về phương thức modelKeys() mà tôi mới học được bây giờ, giống như "thú vị để biết" hơn là thực tế trong các dự án hàng ngày. )

Một trong những nhiệm vụ tôi cần hoàn thành cho ứng dụng Podcast của mình là hiển thị trong chế độ xem Podcast các podcast tiếp theo và trước đó từ cùng một chương trình

Kế hoạch trên frontend rất đơn giản. có hai nút có liên kết đến các bản ghi hàng xóm này, vì vậy người dùng có thể duyệt qua Podcast mà không cần phải tìm kiếm chúng theo cách thủ công

Mặc dù nghe có vẻ dễ dàng, nhưng nó không phải là một điều chắc chắn vì không có truy vấn SQL tiêu chuẩn nào tồn tại để thực hiện điều này trên tất cả các công cụ trong một câu lệnh đơn giản. Ý tôi là, chúng ta không thể nói điều này với cơ sở dữ liệu và mong đợi công cụ biết những gì chúng ta đang cố gắng làm

SELECT *
FROM 'podcasts'
WHERE podcasts.id = 4
WITH NEXT, PREV

Nói cách khác, chúng ta không thể thực hiện truy vấn nào để truy xuất những gì xuất hiện tiếp theo và những gì xuất hiện trước một bản ghi nhất định, bởi vì SQL không biết các bản ghi “láng giềng” hợp lệ là gì, ít hơn về cách sắp xếp chúng một cách tự nhiên vì bản ghi cuối cùng thay đổi từ

Tất nhiên luôn có nhiều hơn một giải pháp cho một vấn đề nhất định. Trong trường hợp này, tôi đã xoay vòng giữa nhiều giải pháp, nhưng tôi đã kết thúc với một giải pháp không quá kỹ thuật, có thể hoạt động mà không gặp trở ngại nào và là công cụ SQL bất khả tri. SQLite, MySQL, MariaDB, PostgreSQL, SQL Server và những gì không

Hai truy vấn SQL để cai trị tất cả

Thay vì buộc chúng ta phải thực hiện các lệnh gọi SQL thô tới cơ sở dữ liệu và các truy vấn phức tạp chỉ để thực hiện mọi thứ trong một dòng, chúng ta sẽ chỉ đưa ra hai truy vấn nữa. một cho bản ghi tiếp theo và một cho bản ghi trước đó

Điều gì được coi là tiếp theo và trước đó?

Trong các truy vấn này, chúng tôi sắp xếp thứ tự bảng theo thứ tự nghịch đảo để biến bản ghi hiện tại thành "trần", sau đó chúng tôi lấy bản ghi đầu tiên trong danh sách

$podcast = Podcast::find(4);$next = Podcast::where('id', '>', $podcast->id)
->oldest('id')
->first();
$prev = Podcast::where('id', '<', $podcast->id)
->latest('id')
->first();

Tôi không hiểu những gì bạn đang cố gắng làm

Để có được Podcast tiếp theo, chúng tôi sẽ sắp xếp thứ tự bảng từ bảng cũ nhất trước, có nghĩa là “sắp xếp ID theo thứ tự tăng dần”. Sau đó, chúng tôi sẽ chọn bảng chỉ những người lớn hơn ID Podcast. Bản ghi đầu tiên sẽ là bản ghi đầu tiên có ID lớn hơn

Đối với Podcast trước, chúng tôi làm ngược lại. Chúng tôi sắp xếp ID từ mới nhất (thứ tự giảm dần), loại bỏ bảng cho những ID nhỏ hơn ID Podcast và loại bỏ ID đầu tiên trong danh sách

Theo cách đó, nếu Podcast có ID là

// Same result as above. Even same character count :)
$permissionIDs = $role->permissions->modelKeys();
2, chúng tôi có thể an toàn lấy bản ghi có ID
// Same result as above. Even same character count :)
$permissionIDs = $role->permissions->modelKeys();
3 là “tiếp theo” và bản ghi có ID
// Same result as above. Even same character count :)
$permissionIDs = $role->permissions->modelKeys();
4 là “trước đó”

Ưu điểm nhiều hơn nhược điểm

Cách tiếp cận này khắc phục các sự cố mà nhiều giải pháp khác gặp phải

  • Không cần cộng hoặc trừ ID, vì điều này RẤT không đáng tin cậy và có thể trả về kết quả không mong muốn hoặc thoát khỏi dữ liệu hợp lý
  • Ngoài ra, chúng tôi có thể lọc truy vấn, trong trường hợp này đối với chương trình Podcast, nó thuộc về một mệnh đề
    // Same result as above. Even same character count :)
    $permissionIDs = $role->permissions->modelKeys();
    5 khác
  • Nếu mô hình sử dụng Xóa mềm, các bản ghi được xóa mềm sẽ không được xem xét vì Eloquent sẽ tự động áp dụng phạm vi
  • Chúng tôi có thể mong đợi một cách an toàn
    // Same result as above. Even same character count :)
    $permissionIDs = $role->permissions->modelKeys();
    6 cho bản ghi tiếp theo và trước đó nếu chúng tôi đang kiểm tra bản ghi cuối cùng hoặc đầu tiên tương ứng

Ngoài ra, bạn có thể sử dụng dấu thời gian (

$podcast = Podcast::find(4);$next = Podcast::where('id', '>', $podcast->id)
->oldest('id')
->first();
$prev = Podcast::where('id', '<', $podcast->id)
->latest('id')
->first();
0 và
$podcast = Podcast::find(4);$next = Podcast::where('id', '>', $podcast->id)
->oldest('id')
->first();
$prev = Podcast::where('id', '<', $podcast->id)
->latest('id')
->first();
1 theo mặc định) nếu bạn đang sử dụng UUID hoặc cột không tuần tự khác

Nếu bạn không nhấn các chỉ mục hoặc khóa chính cho các truy vấn này, các truy vấn SQL có thể trở nên chậm hơn khi bảng lớn hơn vì nó sẽ cần quét toàn bộ bảng

$next = Podcast::where('created_at', '>', $podcast->created_at)
->oldest()
->first();

Bạn có thể sử dụng bộ đệm hoặc lưu trữ thông tin này vĩnh viễn ở đâu đó, nhưng bạn sẽ phải kích hoạt bản cập nhật nếu bản ghi bị sửa đổi hoặc bị xóa. Điều này có thể được khắc phục vĩnh viễn bằng cách thêm chỉ mục tổng hợp hoặc khóa chính

Việc thêm một chỉ mục tổng hợp hoặc các khóa chính sẽ tránh gửi yêu cầu trong vài giây trên các bảng có nhiều bản ghi, điều này cũng làm cho các truy vấn đến UUID hiển thị nhanh chóng vì chỉ mục tổng hợp có thể hoạt động bằng cách sử dụng cột đầu tiên

Ví dụ: giả sử chúng tôi sử dụng UUID và chúng tôi muốn lọc Podcast theo UUID chương trình của chúng

// Same result as above. Even same character count :)
$permissionIDs = $role->permissions->modelKeys();
0

Ở trên sẽ mất rất nhiều thời gian nếu chúng tôi hiện đang lưu trữ 1.000 bản ghi trong cơ sở dữ liệu, nhưng một chỉ mục trên cả hai cột này có thể giúp nó nhanh hơn và cũng giúp lọc chương trình nhanh hơn

// Same result as above. Even same character count :)
$permissionIDs = $role->permissions->modelKeys();
1

Một lần nữa, tôi nghĩ rằng đây là một cách tuyệt vời để khắc phục vấn đề này trên một số trang web mà không cần phải thiết kế quá mức các truy vấn SQL

Mã này có sẵn trong gói Laratraits của tôi dành cho Laravel, với rất nhiều công cụ hữu ích khác. Hãy xem nếu bạn không muốn phát minh lại bánh xe

Làm cách nào để lấy tất cả dữ liệu theo id trong Laravel?

ModelName. find($id, ['tên', 'họ']); . .
12 câu trả lời. Được sắp xếp bởi
1 – Sử dụng all() hoặc get(); . tất cả các();
2 – Sử dụng mặt tiền DB. .
3 – Sử dụng mặt tiền DB với lựa chọn

Làm cách nào để lấy dữ liệu từ cơ sở dữ liệu theo id trong Laravel 8?

Bước 1. if($login) //đăng nhập thành công { Phiên. đặt ('userid', $userid);
Thiết lập lộ trình Lộ trình. get('profile',['uses' => 'UserProfileContoller@index']);
Bộ điều khiển

Làm cách nào để tìm nạp dữ liệu bằng mệnh đề where trong Laravel?

$categoryOne = DB. bảng ('bài đăng') ->where ('category_id', 1); . table('posts') ->where('category_id', 2) ->union($categoryOne) ->get();

Làm cách nào để lấy dữ liệu từ cơ sở dữ liệu bằng Laravel?

Sau khi định cấu hình cơ sở dữ liệu, chúng tôi có thể truy xuất các bản ghi bằng cách sử dụng mặt tiền DB với phương thức chọn . Cú pháp của phương thức select như trong bảng sau. Chạy một câu lệnh chọn đối với cơ sở dữ liệu.