Laravel / Eloquent : hasManyThrough WHERE

后端 未结 3 2151
执念已碎
执念已碎 2021-01-05 18:42

In the documentation of Eloquent it is said that I can pass the keys of a desired relationship to hasManyThrough.

Lets say I have Models named Count

相关标签:
3条回答
  • $this->hasManyThrough('Post', 'User', 'country_id', 'user_id')->where(column,x);

    What happen here is you get the collection in return you can put any condition you want at the end.

    0 讨论(0)
  • 2021-01-05 19:00

    So here it goes:

    models: Country has many User has many Post

    This allows us to use hasManyThrough like in your question:

    // Country model
    public function posts()
    {
      return $this->hasManyThrough('Post', 'User', 'country_id', 'user_id');
    }
    

    You want to get posts of a given user for this relation, so:

    $country = Country::first();
    $country->load(['posts' => function ($q) {
      $q->where('user_id', '=', 3);
    }]);
    // or
    $country->load(['posts' => function ($q) {
      $q->has('user', function ($q) {
        $q->where('users.id', '=', 3);
      });
    })
    
    $country->posts; // collection of posts related to user with id 3
    

    BUT it will be easier, more readable and more eloquent if you use this instead: (since it has nothing to do with country when you are looking for the posts of user with id 3)

    // User model
    public function posts()
    {
      return $this->hasMany('Post');
    }
    
    // then
    $user = User::find(3);
    // lazy load
    $user->load('posts');
    // or use dynamic property
    $user->posts; // it will load the posts automatically
    // or eager load
    $user = User::with('posts')->find(3);
    
    $user->posts; // collection of posts for given user
    

    To sum up: hasManyThrough is a way to get nested relation directly, ie. all the posts for given country, but rather not to search for specific through model.

    0 讨论(0)
  • 2021-01-05 19:13
    $user_id = 3;
    
    $country = Country::find($country_id);
    
    $country->posts()->where('users.id', '=', $user_id)->get();
    
    0 讨论(0)
提交回复
热议问题