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

4 php model laravel

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

我想通过id获取用户并将它们存储在一个数组中:

public function getFriends() {
    $friendids = explode(',', $this->friends);
    $friends = [];

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

    return $friends;
}
Run Code Online (Sandbox Code Playgroud)

所以我可以在我看来这样做:

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

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

小智 6

使用方法findOrFail($ id); 你应该调用你想要的对象类型.例

foreach ($friendids as $id) {
        $friends[] = User::findOrFail($id);
    }
Run Code Online (Sandbox Code Playgroud)


小智 1

我犯了两个简单的错误:

1)我在寻找我犯的错误时删除了User对象findOrFail()

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;
}
Run Code Online (Sandbox Code Playgroud)

现在你可以在你看来做这样的事情:

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

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

就我而言, $user 是我当前正在查看的个人资料的用户。如果你愿意,你也可以只得到你的朋友,通过这样做Auth::user()->getFriends()

/编辑:在 foreach 循环中添加了 is_numeric 检查。这样您就不必担心列中的第一个和最后一个元素有额外的逗号。由于爆炸会向数组添加一个额外的值,因此如果朋友列的末尾有逗号。现在,您每次都可以在列中添加或删除x,,而不必担心获取不存在的对象。