繁体   English   中英

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()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM