Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel通过用户模型中的id获取用户,并将其存储在数组中_Php_Laravel_Model - Fatal编程技术网

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

Php Laravel通过用户模型中的id获取用户,并将其存储在数组中,php,laravel,model,Php,Laravel,Model,我试图创建一个简单的“朋友”系统,将每个朋友id存储在一列中,作为一个用逗号分隔的字符串 我想按id获取用户并将其存储在数组中: public function getFriends() { $friendids = explode(',', $this->friends); $friends = []; foreach ($friendids as $id) { $friends[] = User::findOrFail($id); }

我试图创建一个简单的“朋友”系统,将每个朋友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
@foreach($user->getFriends()作为$friend)
朋友ID:{{$Friend->ID}

朋友用户名:{{$Friend->Username}

@endforeach

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

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

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

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

首先,将好友保存为逗号分隔的列表无法很好地扩展。它还极大地限制了您执行诸如“朋友的朋友”和其他更复杂查询的能力

实际上,您应该有两个表,
users
friends

用户模型 现在,当朋友请求被拒绝时,您只需删除
Friends
表中的记录即可

正在加载用户及其好友: 加载用户的好友请求:
您可能还想退房。这本书是由一位在Laravel社区非常有名的人写的,他有着先进的雄辩的用法。

我犯了两个简单的错误:

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;
}
//App/User.php
公共函数getFriends($friends\u to\u get=null){
$friendids=分解(“,”,$this->friends);
$friends=[];
$i=0;
foreach($friendids作为$id){
如果(是数字($id)){
$friends[]=User::findOrFail($id);
}
如果(设置($friends\u to\u get)&&$i<$friends\u to\u get){
++$i;
}
如果(设置($friends\u to\u get)&&$i==$friends\u to\u get){
打破
}
}
返回$friends;
}
现在,您可以在视图中执行以下操作:

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

朋友用户名:{{$Friend->Username} @endforeach
或者,如果您只想得到6个朋友,您可以这样做:
$user->getFriends(6)

在我的例子中,$user是我当前查看的个人资料的用户。如果您愿意,也可以通过执行
Auth::user()->getFriends()


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

啊,是的,这是一个简单的错误。我以前确实有对象类型,但我一定是在搜索错误时意外删除了它。问题实际上是,我在数据库中指定了用户id,但该id不存在,并且我无法正确读取错误,smh。如果有人想使用相同的方法,请在主帖子中修复。这是非常低效的。对于每个朋友,您都在运行一个查询。当每个用户都有数百个朋友时,这种情况就不能很好地扩展。我真的很感谢您的回复,但是我目前正在进行的项目不需要那么复杂的查询。然而,当我将来要做类似的事情时,我会考虑这个问题。谢谢依我看,这不太复杂,而且是laravel的方式。是否
$user::find($id)
在幕后向数据库发出查询?或者是从缓存/会话加载的?
$users = Friends::where('accepted', false)->where('target_user', $userId)->get();
// 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