错误:此集合实例上不存在属性[uploads] - 一对多关系

时间:2017-12-07 14:43:44

标签: php laravel laravel-5

我正在尝试在“我的用户”表和“上传”表之间建立一对多的关系。

为此,我做了以下事情:

将此功能添加到我的User表:

public function uploads(){
        return $this->belongsTo('App\Upload');
    }

这到我的Upload表:

public function user(){
        return $this->belongsTo('App\User');
    }

然后我将这个简单的函数添加到我的UploadController:

   public function uploads()
{  
    $user_id = auth()->user('id');
    $user = User::find($user_id);
    return view('uploads')->with('uploads',$user->uploads);
}

我的上传视图如下所示:

 @extends('layouts.app')
@section('content')
    <h1>Uploads</h1>
    @if(count($uploads)>0)
@foreach($uploads as $upload)
    <div class="well">
        <h3><a href="/uploads/{{$upload->id}}">{{$upload->name}}</a> </h3>
        <small>Written on {{$upload->created_at}}</small>

    </div>
        @endforeach
             {{$uploads->links()}}
    @else
    <p>No uploads found</p>
    @endif

@endsection

当我尝试转到myproject.dev/uploads时,我收到以下错误:

  

此集合实例上不存在属性[uploads]。

由于我是laravel的新手,据我所知,在制作这样的东西之后我不必进行迁移。但它仍然没有工作,我只是不知道我做错了什么?我只是按照文档....

2 个答案:

答案 0 :(得分:1)

User模型的关系存在问题,应该是这样的:

public function uploads(){
    return $this->hasMany('App\Upload');
}

然后你必须急于加载上传:

$user = User::with('uploads')->find($user_id);

但在你的情况下,更好的解决方案是加载上传而不是用户,因为你使用分页,所以:

public function uploads()
{  
    $user_id = auth()->user('id');
    $uploads = Upload::whereHas('user', function ($query) use($user_id) {
                        $query->where('id', $user_id);
                    })
                    ->paginate(10);
    return view('uploads')->with('uploads',$uploads);
}

Ps:您可以在paginate函数中更改10以​​选择每页所需的元素。

答案 1 :(得分:0)

您需要急切加载User模型uploads。为此,只需在您的Eloquent查询中添加:

$user = User::whereId($user_id)->with('uploads')->first();

同样在你的User模型中,你在雄辩的关系中有错误。您需要说明Useruploadsupload属于User

public function uploads() 
{
    return $this->hasMany(Upload::class)
}