【问题标题】:Access followers data Laravel 5.8 and Eloquent访问关注者数据 Laravel 5.8 和 Eloquent
【发布时间】:2019-04-05 21:25:51
【问题描述】:

我有一个为追随者设置的基表,追随者模型与用户模型有关系belongsTo。用户模型与追随者模型有关系belongsToMany。追随者表有“id,follower_id,leader_id”

我正在尝试通过 User 模型访问关注者表,但它不允许我这样做。我一定是做错了什么,但我以前曾与 Eloquent 关系合作过,而且我一直都在工作。有人可以看看下面的代码 sn-ps 并指出问题所在吗?

用户模型

 public function followers(){
        return $this->belongsToMany(User::class, 'followers', 'leader_id', 'follower_id')->withTimestamps();
    }

    public function followings(){
        return $this->belongsToMany(User::class, 'followers', 'follower_id', 'leader_id')->withTimestamps();

追随者模式

protected $table = 'followers';
    public $primaryKey = 'id';
    public $timestamps = true;

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

FollowerController

Old controller for old relationship
// public function followUser($id){
    //     $user = User::find($id);

    //     if(!$user){
    //         return redirect()->back()->with('error', 'User does not exist.');
    //     }

    //     $user->followers()->attach(auth()->user()->id);

    //     return redirect()->back()->with('success', 'You now follow the user!');
    // }


//New controller
    public function followUser($id){
        $user = User::find($id);
        if(!$user){
            return redirect()->back()->with('error', 'User does not exist.');
            }

            $follow = new Follower;
            $follow->follower_id = Auth::user()->id;
            $follow->leader_id = $user;

            $follow->save();
            return redirect()->back()->with('success', 'You now follow the user!');

    }

用户控制器

 // This is a test function
    public function index($id){
        $userid = Auth::user();
        $user = User::find($id)->followers;
        $recipe = Recipe::find(5);
        $savedRecipes = Save::where('user_id', '=', $userid);

        return view('welcome')->with('recipe', $recipe)->with('user', $user)->with('savedRecipes', $savedRecipes);

    }

测试视图

 <div class="content">
                <div class="title m-b-md">
                    Welcome to the TestLab: {{$user->followers->follower_id}}
                    <br>

这会引发“在此实例上找不到属性”的错误。 所有的命名空间都是有序的,所以这也不是问题。 这里有什么问题?

【问题讨论】:

  • 一个关注者属于一个用户,一个用户有很多关注者,对吧?
  • 我不应该在那里使用belongsToMany吗?
  • 仅当一个用户有很多关注者并且一个关注者有很多用户时

标签: laravel eloquent


【解决方案1】:

如果您在用户和关注者之间存在 一对多 关系,则您的关系定义错误,如果关注者属于用户,则用户 hasMany 关注者:

 public function followers(){
        return $this->hasMany('App\Follower','user_id');
 }

看看docs

你的控制器:

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

您可以使用 foreach 循环访问用户的每个关注者:

@foreach($user->followers as $follower)
    {{$follower->anyAttributeFromTheFollower}}
@endforeach

【讨论】:

  • 问题是,foreach 循环返回一个空数组。当我尝试访问每个 follower_id 时没有返回任何内容,即使我可以看到它在 DB 表中。
  • 确保将 $user 发送到视图。尝试这样做:$user-&gt;followers-&gt;first()-&gt;id 你应该从第一个关注者那里收到 id
  • 返回“试图获取非对象的属性”。我想在某个地方连接一些东西。 $user 被传递给视图。我可以使用 $user->anyAttribute 检索用户表上的任何属性。但这并没有让我从追随者那里得到任何东西......
  • 这很奇怪,你改变了我在回答中写的关系?尝试使用:return $this-&gt;hasMany('App\Follower','user_id');
  • 现在开始工作了!!就是这样!感谢一百万卢卡斯。您可能希望更新答案中的模型方法,以包括您在上一条评论中写的内容,以防其他人遇到同样的问题!再次感谢!
猜你喜欢
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 2017-02-17
  • 2020-01-31
  • 1970-01-01
相关资源
最近更新 更多