2015-04-23 12 views
5

Tôi đang cố gắng làm một hệ thống tình bạn trong laravel 5 và tôi bị kẹt. Tôi có một bảng friends_user mà trông như thế này:Laravel - Friendship

  • id
  • user_id
  • friend_id
  • tình trạng

Đây là vấn đề, tôi đi đến một trang sử dụng, và Ii muốn xem như thế nào là mối quan hệ của tôi với người dùng này, 4 giải pháp:

  • Chúng ta là bạn
  • Chúng tôi không
  • Ông không chấp nhận yêu cầu chưa
  • tôi phải xác nhận hay không.

Tôi muốn tạo ra một phương pháp để kiểm tra nếu người dùng là người bạn với một khác, đơn giản. Tôi có một cột 'tình trạng' mà là một boolean (0 cho cấp phát và 1 cho bạn bè) Các giải pháp hoàn hảo đối với tôi sẽ là để có thể theo một phương pháp để kiểm tra xem:

  • Người sử dụng là người bạn, như vậy ('user_id', Auth :: user() -> id) -> và ('friend_id', $ friend-> id) hoặc ngược lại ('user_id', $ friend-> id) -> và (' friend_id ', Auth :: user() -> id), nó phải kiểm tra trong 2 giác quan
  • Tôi đã gửi yêu cầu và phải đợi câu trả lời của mình
  • Tôi đã nhận được yêu cầu và phải chấp nhận yêu cầu đó.
  • Chúng tôi không phải là bạn và vì vậy, tôi có thể thêm anh ấy.

Vì vậy, nếu bạn có thể cho tôi biết nơi tôi sai ở đây, đây là logic của tôi (chỉ để kiểm tra nếu người dùng là người bạn): user.php

public function isFriend($slug) 
{ 
    // Get both user 
    $user = Auth::user(); 
    $receiver = User::where('slug', $slug)->first(); 
    // get list of friends (so who have status = 1) 
    $result = Friends::where('status', 1); 
    // Get users where user id is equal to connected 
    $result = $result->where('user_id', $user->id)->where('friend_id', $receiver->id); 
    $result = $result->orWhere('user_id', $receiver->id)->where('friend_id', $user->id); 
    $result = $result->get(); 
    if(count($result) == 0) 
     return false; 
    return true; 
} 

Sau khi tôi làm những kiểm tra trong quan điểm của tôi .

Điều này làm việc khá nhiều, nhưng chỉ khi tôi (người dùng hiện tại) gửi yêu cầu nhưng nếu ngược lại, nó trả về cho tôi người dùng ngay cả khi trạng thái ở mức 0. Tôi nghĩ rằng kết quả $ của tôi sẽ xóa những người khác isn ' t nó? Giải pháp như vậy là gì?

Tôi hy vọng nó rõ ràng, và nếu bạn có thể cho tôi biết làm thế nào để làm điều này một cách sạch sẽ, nó sẽ là tuyệt vời.

+0

Xem loạt bài này .. https://laracasts.com/series/build-a-laravel-app-from-scratch Có một bài học trong đó về bạn bè – bretterer

+2

Bạn đang rối tung mọi thứ một chút tại sao bạn có một bảng Bạn bè? Một người bạn không phải là người dùng? nếu vậy tại sao bạn không có nhiều mối quan hệ tự trên bảng người dùng? –

+1

@bretterer Bạn cần đăng ký để truy cập video. (Nhưng nếu bạn muốn tìm hiểu về laravel và php, đây là cách rất tốt để đầu tư $ 9) – Needpoule

Trả lời

3

Đó là lỗi thường gặp. Cẩn thận với mệnh đề "orWhere" của bạn.

public function isFriend($slug) 
{ 
    // Get both user 
    $user = Auth::user(); 
    $receiver = User::where('slug', $slug)->first(); 
    // get list of friends (so who have status = 1) 

    $result = Friends::where('status',1)->where(function($query) use ($receiver,$user) 
    { 
     $query->where([ 
      'user_id' => $user->id, 
      'friend_id' => $receiver_id 
     ])->orWhere([ 
      'user_id' => $receiver->id, 
      'friend_id' => $user->id 
     ]); 

    })->get(); 

    return ! $result->isEmpty(); 
}