Php Laravel通过用户模型中的id获取用户,并将其存储在数组中
我试图创建一个简单的“朋友”系统,将每个朋友id存储在一列中,作为一个用逗号分隔的字符串 我想按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); }
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