1

我正在尝试使用 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) 社区_用户(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');
    }
}
4

2 回答 2

1

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

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

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

于 2019-04-07T09:34:14.767 回答
1

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

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

另外,请记住 Eloquent 不支持复合主键,因此您必须在模型中设置community_idoruser_id作为主键CommunityUsers才能在其上使用该find()方法,否则 Laravel 将按id列搜索。

我宁愿在关系表中插入一个新的主自动增量列,并使用这样的 where 过滤来检索一个特定的社区:

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

注意:您也可以将该过滤器设置为CommunityUsers范围方法。

此外,请注意您的关系 from UserstoCommunityUsers一对多关系(一个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');
    }
}

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

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
        ]
    );
}
于 2019-04-07T11:00:27.020 回答