2015-01-21 15 views
9

Tôi muốn xóa người dùng quản trị khỏi bộ sưu tập của mình. Tôi biết khóa chính của nó trong bảng (id) là 1. Nhưng khi tôi sử dụng forget(1) nó sẽ xóa phần tử mảng trong bộ sưu tập bắt đầu từ 0. Làm cách nào để xóa mục khỏi bộ sưu tập theo id?Laravel: cách xóa mục khỏi Bộ sưu tập theo id

// Grab all the users 
    $users = User::all(); //$this->user; use to return array not Laravel Object 
    if($users->find(1)->hasRole('admin')) 
     $users->forget(0); 
+0

bạn có nghĩa là, bạn không muốn xóa khỏi cơ sở dữ liệu ? chỉ từ bộ sưu tập $ user? –

+0

có. tôi không muốn hiển thị người dùng quản trị trong danh sách người dùng trên chế độ xem của tôi. – Phil

+0

bản sao có thể có của [Quên không hoạt động] (http://stackoverflow.com/questions/20735181/forget-doesnt-work) – ceejayoz

Trả lời

13

Thay vì cố gắng xóa một mục khỏi bộ sưu tập, sẽ tốt hơn nếu bạn không bao giờ chọn nó ngay từ đầu.

Bạn có thể thêm một hạn chế để truy vấn DB của bạn như thế này:

$users = User::where('role', '!=', 'admin')->get(); 

(Nó có thể là một chút khác nhau tùy thuộc vào cách vai trò được định nghĩa trong lược đồ).

Nếu bạn đang sử dụng một sơ đồ phức tạp hơn với một roles bảng riêng biệt và user_role bảng, bạn có thể truy vấn như thế này:

$users = User::whereHas('roles', function($q){ 
    $q->where('role', '!=', 'admin'); 
})->get(); 

Đó là một ý tưởng tồi phải dựa vào người dùng quản trị luôn luôn là mục đầu tiên trong bộ sưu tập. Điều gì xảy ra nếu sau này bạn muốn có nhiều người dùng quản trị hoặc sắp xếp danh sách người dùng theo ngày đăng ký? Nếu bạn thực sự muốn xóa quản trị từ bộ sưu tập, hùng hồn đã tích hợp chức năng lọc:

$usersWithoutAdmins = $users->filter(function($user) 
{ 
    return !$user->hasRole('admin'); 
}); 
+1

Câu trả lời rất hay. Tôi đang sử dụng Confide/Entrust tương ứng với giải pháp thứ 2 của bạn ngoại trừ nó sử dụng cột 'name' thay vì' vai trò'. Giải pháp không chọn người dùng không có vai trò được giao ... Tôi sẽ cần phải thực thi gán vai trò cho tất cả người dùng mà tôi có lẽ nên làm dù sao ... vì vậy quá mức cần thiết cho những gì tôi cần nhưng tốt thôi. Sẽ không mất nhiều thời gian để tôi hy vọng. – Phil

+0

Tôi gặp rất nhiều khó khăn với Confide/Entrust cố gắng để lưu mối quan hệ cho vai trò ... vui lòng xem [laravel-how-to-query-to-get-tất-cả-hồ sơ-ngoại trừ-nơi-quan hệ-có-tên-cột ] http://stackoverflow.com/questions/28095206/laravel-how-to-query-to-get-all-records-except-where-relation-has-name-column nếu bạn biết cách thực hiện lần 2 truy vấn bạn đã chỉ cho tôi để có được những người dùng không có vai trò nào. – Phil

14

Như vậy câu trả lời bencohenbaritone 's là cách tốt hơn để giải quyết vấn đề này, tôi phải nói thêm rằng Laravel hùng biện Collection có phương thức except(), có thể xóa đối tượng Eloquent khỏi bộ sưu tập theo khóa chính thay vì forget(). Loại thứ hai sẽ bị xóa bằng khóa chỉ mục thu thập (như array[i]) chứ không phải bằng khóa chính.

Vì vậy, bạn có thể viết một cái gì đó tương tự (xin lỗi về những tấm gương xấu, trường hợp sử dụng của riêng tôi là quá khác nhau để thể hữu ích cho những người khác):

$admin_user_id = 20; 
$users = User::all(); 
$users_without_admin = $users->except($admin_user_id); 
+0

Điều này đã giúp tôi, bởi vì tôi có một tình huống mà tôi không thể làm đúng với một truy vấn chỉ có cơ sở dữ liệu và đây chỉ là vé! – mydoglixu

Các vấn đề liên quan