So on the “Friend Request” …
I am not quite sure why you have Accepted and Pending as references to other Friend Requests ?
Maybe I am not understanding what you are trying to do, but I would have thought you wanted something like…
Requestor type : user
Reciever type : user
Status : pending/accepted/rejected.
So when your user selects another user to be a friend (and they aren’t already) then you create the thing.
You could then have a custom event that is watching for the logged in user appearing in the thing.
An alternative would be to simply do it on page load (rather than an “instant” action). So have a “Pending Friend Request” field appear that is clickable.
If the request is accepted, then you may want to have a new field on the User which is a list of friends.
Here is the way I did this …
So on friend acceptance, I add the receiver user to my_friend_list on the requestor, and vice versa.
This current implementation doesn’t have the pending request function that you are after (i.e. someone requests, then someone accepts). But the logic would be the same. Mine is more like Twitter in that you can friend without them befriending back.