Laravel 5.5 - 数据透视表和很多关系

时间:2017-11-16 04:37:11

标签: php laravel

我们说我有以下内容。 4个表和3个模型(角色,帖子,用户)。

enter image description here

可以为User分配多个RolesRoles可以分配给多个Users

Posts可以在数据库中为每个条目创建一个Role

我需要帮助

我希望能够从相关角色中获取用户所有帖子的列表。因此,通过调用auth()->user()->getPosts(),我应该从Posts获取附加到Roles的所有User。我以为我可以使用hasManyThrough,但我不知道它可以帮到我的案例:SQLSTATE[42S22]: Column not found: 1054 Unknown column 'roles.user_id' in 'field list' (SQL: select发布.*,个角色. user_id from帖子inner join角色on角色. ID为=的帖子. ROLE_ID where角色.的user_id = 1)

到目前为止,这是我的模型:

user.php的

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }

    public function posts()
    {
        return $this->hasManyThrough(Posts::class, Role::class);
    }
}

Role.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class);
    }
}

Posts.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Posts extends Model
{
    public function roles()
    {
        return $this->hasMany(Role::class);
    }
}

在此处克隆此问题:https://github.com/naknode/eloquent-help

1 个答案:

答案 0 :(得分:1)

忘掉hasManyThrough,我错了。

在这里你可以这样做:

    $user = User::with('roles')->first();

    $userPosts = Posts::whereIn('role_id', $user->roles->pluck('id')->toArray())->get();

    return $userPosts;

如果您想通过致电auth()->user()->getPosts()来获取帖子,请将以下方法添加到您的用户模型中:

public function getPosts()
{
    return Posts::whereIn('role_id', $this->roles->pluck('id')->toArray())->get();
}