试图获取一个记录集,其中包含您所关注的人的所有文件

时间:2018-12-22 20:34:22

标签: laravel laravel-5 eloquent

我正在尝试为正在创建的网站提供一个小功能,让您关注其他用户,然后您的仪表板会按照上传日期的顺序填充他们上传的文件。 (您可以将其与youtube进行比较。您订阅频道,并在订阅页面上按关注的人的日期依次观看每个视频)。

这是我的模型结构(简化后仅显示了所需的值)

关注

  • my_id(这是您的ID)
  • user_id(这是您关注的用户的ID)

用户

  • id(用户ID)

文件

  • user_id(上传文件的用户的ID)
  • 路径(文件路径)

我现在已经尝试了很多事情来获取数据:

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);
    }

2 个答案:

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

filesFollow模型的动态属性(不是集合也不是数组)。 因此,这将不会如您所愿。

您正确的解决方案

您应该使用雄辩的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)

我认为您可以分两步进行此操作。

  1. 获取用户关注的用户
  2. 从第一个查询中获取具有ID的用户的文件