Laravel在用户模型中通过id获取用户,并将其存储在数组中


Laravel get users by id in user model and store them in an array

我正在尝试创建一个简单的"好友"系统,通过将每个好友id存储在单个列中,作为用逗号分隔的字符串。

我想通过id获取用户并将其存储在数组中:

public function getFriends() {
    $friendids = explode(',', $this->friends);
    $friends = [];
    foreach ($friendids as $id) {
        $friends[] = User::findOrFail($id);
    }
    return $friends;
}

我可以在我的视图中这样做:

@foreach ($user->getFriends() as $friend)
    <p>Friend ID: {{ $friend->id }}</p>
    <p>Friend Username: {{ $friend->username }}</p>
@endforeach

但是我认为我不能在用户模型中使用findOrFail或者我做错了什么?

要使用findOrFail($id)方法,您应该调用想要获得的对象类型。例子:

foreach ($friendids as $id) {
        $friends[] = User::findOrFail($id);
    }

虽然已有答案,但我想提供一个我个人认为更好的长期解决方案。

首先,将好友保存为逗号分隔的列表并不能很好地扩展。它还极大地限制了你做一些事情的能力,比如"朋友的朋友",以及其他更复杂的查询。

真的,你应该有两个表,usersfriends

用户模型
public function acceptedFriends()
{
    return $this->hasMany('App'Friend')->where('accepted', true);
}
public function pendingFriends()
{
    return $this->hasMany('App'Friend')->where('accepted', false);
}

现在,当朋友请求被拒绝时,您可以简单地删除Friends表中的记录。

用好友加载用户:

$user = User::find($id)->with('acceptedFriends')->firstOrFail();

加载用户的好友请求:

$users = Friends::where('accepted', false)->where('target_user', $userId)->get();

您可能还想查看https://stackoverflow.com/a/25057320/972370。它是由一个在Laravel社区中非常有名的高级Eloquent用法的人编写的。

我犯了两个简单的错误:

1)当寻找我所犯的错误时,我从findOrFail()中删除了User对象

2)我指定了数据库中不存在的用户id(朋友),导致错误

我还对代码进行了一些改进,通过添加一个可选参数来只获得x数量的用户:

// App/User.php
public function getFriends($friends_to_get = null) {
    $friendids = explode(',', $this->friends);
    $friends = [];
    $i = 0;
    foreach ($friendids as $id) {
        if (is_numeric($id)) {
            $friends[] = User::findOrFail($id);
        }
        if (isset($friends_to_get) && $i < $friends_to_get) {
            ++$i;
        }
        if (isset($friends_to_get) && $i == $friends_to_get) {
            break;
        }
    }
    return $friends;
}

现在你可以在视图中这样做:

@foreach ($user->getFriends() as $friend)
    <p>Friend ID: {{ $friend->id }}</p>
    <p>Friend Username: {{ $friend->username }}
@endforeach

或者,如果你想获得,例如,6个朋友,你可以这样做:$user->getFriends(6)

在我的例子中,$user是我当前正在查看的个人资料的用户。如果你愿意,你也可以只获得你的朋友,通过Auth::user()->getFriends()

/Edit:在foreach循环中添加is_numeric检查。这样,您就不必担心列中的第一个和最后一个元素有一个额外的逗号。因为explosion向数组中添加了一个额外的值,如果好友列的末尾有一个逗号。现在您只需每次从/到列中添加或删除x,,而不必担心获取不存在的对象。