我如何使用laravel雄辩的关系来获得社区关注者

时间:2019-04-07 09:26:20

标签: laravel laravel-5 eloquent--relationship

我正在尝试使用Laravel雄辩的关系创建社区关注系统,但我无法解决问题,请帮忙

基本上,我正在尝试创建一个基于社区(例如:商业与专业,健康与健康,科学与技术等)的活动系统。

它给我以下错误

Illuminate\Database\QueryException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'acp_db.community_users' doesn't exist (SQL: select * from `community_users` where `community_users`.`id` = 8 limit 1) in file /Users/muhammadowais/mowais/academics-provider/website/working/acpapi/vendor/laravel/framework/src/Illuminate/Database/Connection.php on line 664

要通过ID吸引社区的关注者,我创建了以下表格

1)用户

2)event_categories(可以说社区)

3)community_user (user_id, community_id)

控制器

public function communityBySlug($slug){
        $eventCategory = EventCategories::where(['slug' => $slug])->first();
        $eventCategoryId = $eventCategory->id;


        // Getting users by community id
        $users = CommunityUsers::find(8)->users();

        return Response::json(
            [
                'data' => $eventCategory,
                'community_followers' => $users
            ]
        );
    }

模型:社区用户

class CommunityUsers extends Model
{
    protected $fillable = ['community_id', 'user_id'];
    protected $guarded = [];

    public function Users(){
        return $this->belongsToMany(User::class, 'users');
    }
}

2 个答案:

答案 0 :(得分:1)

假设community_id是您的CommunityUsers表中的主键,那么问题出在您的Users()函数中:

public function Users(){
    return $this->belongsToMany(User::class, 'users');
}

belongsToMany的第二个参数应该是外键,即user_id

答案 1 :(得分:1)

假定社区用户是将您的多对多关系表映射的模型,则应在数据库中为该模型指定正确的表名。

class CommunityUsers extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'community_users';
}

此外,请记住,Eloquent不支持复合主键,因此您必须将community_iduser_id设置为主键CommunityUsers模型中使用em>来在其上使用find()方法,否则Laravel会在id列中进行搜索。

我宁愿在关系表中插入一个新的主自动增量列,并使用where过滤检索一个特殊的社区,如下所示:

CommunityUsers::where('community_id', $id)->first();

注意:您还可以将该过滤器作为CommunityUsers范围方法。

此外,请注意,您从UsersCommunityUsers的关系是一对多关系(一个User映射到许多CommunityUsers对([community_id,user_id]))

重新思考关系映射

如果考虑这三个表,可以将其建模为UsersCommunities之间的多对多关系。

关系应为:

型号:用户

class User extends Authenticatable
{
    public function communities()
    {
        return $this->belongsToMany(EventCategories::class, 'community_user', 'user_id', 'community_id');
    }
}

模型:事件类别(假设这是您的社区模型)

class EventCategories extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class, 'community_user', 'community_id');
    }
}

注意:上面的代码可能需要根据您的模型及其表定义进行一些调整。

在关系定义之后,您可以直接在EventCategories模型上使用它:

public function communityBySlug($slug){
    $eventCategory = EventCategories::with('users')
        ->whereSlug($slug)
        ->first();

    return Response::json(
        [
            'data' => $eventCategory,
            'community_followers' => $eventCategory->users
        ]
    );
}