Как я могу получить последователей сообщества с помощью laravel Eloquent - PullRequest
1 голос
/ 07 апреля 2019

Я пытаюсь создать систему отслеживания сообщества, используя красноречивые отношения 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

Чтобы получить подписчиков сообщества по идентификатору Я создал следующие таблицы

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

Модель: CommunityUsers

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

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

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Предполагая, что пользователи сообщества - это модель, которая отображает вашу таблицу отношения многих к многим, вы должны указать правильное имя таблицы в базе данных для этой модели.

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

Кроме того, имейте в виду, что Eloquent не поддерживает составные первичные ключи , поэтому вы должны установить community_id или user_id как первичный ключ в CommunityUsers модель для использования метода find(), в противном случае Laravel будет искать по столбцу id.

Я бы лучше вставил новый основной столбец автоинкремента в таблицу отношений и получил бы отдельное сообщество с фильтрацией where, например:

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

Примечание: Вы также можете сделать этот фильтр как CommunityUsers метод области действия.

Кроме того, обратите внимание, что ваше отношение от Users до CommunityUsers является отношением один ко многим (один User соответствует многим парам CommunityUsers ([community_id, user_id]))

Переосмысление отношения отношений

Если вы рассмотрите три таблицы, которые можно смоделировать как отношение многие ко многим между Users и Communities.

Отношения должны быть:

Модель: пользователь

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
        ]
    );
}
1 голос
/ 07 апреля 2019

Предполагая, что community_id является первичным ключом в вашей таблице CommunityUsers, проблема в вашей функции Users():

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

второй параметр belongsToMany должен быть внешним ключом, который равен user_id

...