如何使用 laravel Eloquent 关系获得社区关注者

How can I get the commnunity followers by using laravel Eloquent relationship

我正在尝试使用 Laravel eloquent 关系创建社区关注系统,我无法解决问题,请帮助

基本上我正在尝试创建基于社区(例如:商业与专业、健康与保健、科学与技术等)的事件系统。

它给我以下错误

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');
    }
}

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

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

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

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

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

此外,请记住 Eloquent 不支持 复合主键 ,因此您必须设置 community_iduser_id 作为 CommunityUsers 模型中的 主键 使用 find() 方法,否则 Laravel 将按 id 列搜索.

我宁愿在关系 table 中插入一个新的主要自动增量列,并使用如下过滤条件检索特定社区:

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

注意:您也可以将该过滤器作为 CommunityUsers 作用域方法。

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

重新思考关系映射

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

关系应该是:

型号:用户

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

模型:EventCategories(假设这是您的社区模型)

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

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

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

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

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