我正在尝试为正在创建的网站提供一个小功能,让您关注其他用户,然后您的仪表板会按照上传日期的顺序填充他们上传的文件。 (您可以将其与youtube进行比较。您订阅频道,并在订阅页面上按关注的人的日期依次观看每个视频)。
这是我的模型结构(简化后仅显示了所需的值)
关注
用户
文件
我现在已经尝试了很多事情来获取数据:
Follow::where('me_id', '=', Auth::user()->id)->get()->all()->files;
Follow::where('me_id', '=', Auth::user()->id)->get()->files;
唯一可行的方法是(但这仅适用于1个对象):
Follow::where('me_id', '=', Auth::user()->id)->first()->files;
如果有人看到我在做什么错,那真是太神奇了。
在我的Follow.php
模型中,它是这样连接的。
class Follow extends Model
{
protected $fillable = ['user_id', 'me_id'];
public function me()
{
return $this->belongsTo(User::class, 'id', 'me_id');
}
public function user()
{
return $this->belongsTo(User::class, 'id', 'user_id');
}
public function files()
{
return $this->hasManyThrough(
'App\File', //The model I'm trying to reach
'App\User', //The model I need to go through to reach the files
'id', //This is where I'm going wrong I think
'user_id', //Same here
'user_id', //Same here
'id' //Same here
);
}
}
编辑:
我有工作做2个单独的数据库调用。但这可以在一次调用中实现。参见下面的代码。
public function following(Request $request)
{
$follows = Follow::where('me_id', '=', Auth::user()->id)->get()->all();
$userIds = [];
foreach($follows as $key => $follow) {
$userIds[] = $follow->user_id;
}
$files = File::where('visible', '=', '1')->whereIn('user_id', $userIds)->orderBy('created_at', 'desc')->paginate(12)->onEachSide(3);
}
答案 0 :(得分:1)
您可以使用以下方法来获取文件,因为您可以使用以下模型来定义模型:
Follow::where('me_id', '=', Auth::user()->id)->first()->files;
以下代码返回一个laravel collection:
Follow::where('me_id', '=', Auth::user()->id)->get()
以下代码返回一个数组:
Follow::where('me_id', '=', Auth::user()->id)->get()->all()
files
是Follow
模型的动态属性(不是集合也不是数组)。
因此,这将不会如您所愿。
您应该使用雄辩的relationships功能:
Follow::with('files')->where('me_id', '=', Auth::user()->id)->get()
这将返回Follow
的集合,其中包含它们各自的所有files
。喜欢:
[
'my_id' -> 1,
'user_id' -> 1,
'files' -> [
'user_id' -> 1,
'path' -> '/foo/bar'
]
]
答案 1 :(得分:0)
我认为您可以分两步进行此操作。