Как я могу получить всех пользователей, которые прокомментировали сообщение? - PullRequest
0 голосов
/ 06 мая 2018

Я работаю с Laravel 5 и у меня есть следующие модели

PostComment.php

class PostComment extends Model
{
    protected $fillable = [
        'post_group_id', 'user_id', 'comment_content'
    ];

    public function post(){
        return $this->belongsTo('App\PostGroup');
    }

    public function user(){
        return $this->belongsTo('App\User');
    }

}

PostGroup.php

class PostGroup extends Model
{
    protected $fillable = [
        'group_id', 'user_id', 'post_content'
    ];

    public function user(){
        return $this->belongsTo('App\User');
    }

    public function group(){
        return $this->belongsTo('App\Group');
    }

    public function commented(){
        return $this->hasMany(
            'App\PostComment'
        );
    }
}

Group.php

class Group extends Model
{

    protected $fillable = ([
    'id'
    ]);

    public function users(){
        return $this->belongsToMany(
            'App\User',
            'user_group'
        );
    }

    public function members(){
        return $this->belongsToMany(
           'App\User',
           'user_group'
        )->wherePivot('state','accepted');
    }


    public function posted(){
        return $this->hasMany(
            'App\PostGroup'
        );
    }
}

Мое веб-приложение представляет groups, в котором вы можете создать posts и в каком посте вы можете написать comments. В моей базе данных есть следующие отношения:

  • Группа: (идентификатор, имя, описание);
  • PostGroup: (id, group_id, user_id, post_content);
  • PostComment: (id, post_group_id, user_id, comment_content);

Я хочу создать коллекцию объектов User, а затем сделать запрос , чтобы получить всех пользователей, подписанных на группу, которые прокомментировали определенный пост в MySQL выглядит так:

select users.* from users, post_comments where users.id = post_comments.user_id and post_comments.post_group_id="1"

Итак, в моем контроллере есть следующий код

$theGroup = Group::find($groupId);
$thePost = PostGroup::find($postId);
$memberList = User::where('id', '<>', Auth::user()->id)->whereIn('id', $theGroup->users->pluck('id'))->

Итак, я хочу расширить этот запрос, чтобы получить желаемый результат, с помощью ->get()->sortBy('last_name');, как я могу завершить его после whereIn?

EDIT

User.php

class User extends Authenticatable
{

    /**
     * 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','created_at','updated_at'
    ];

    public function groups(){
        return $this->belongsToMany('App\Group','user_group');
    }

    public function groupsAsAdmin(){
        return $this->belongsToMany('App\Group','user_group')->wherePivot('role','admin');
    }

    public function groupsAsMember(){
        return $this->belongsToMany('App\Group','user_group')->wherePivot('state','accepted');
    }

    public function groupsAsInvited(){
        return $this->belongsToMany('App\Group','user_group')->wherePivot('state','pending');
    }

    public function posted(){
        return $this->hasMany('App\PostGroup');
    }

    public function commented(){
        return $this->hasMany('App\PostComment');
    }
}

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

В PostComment попробуйте это

$this->selectRaw(‘user_id, comment_content’)->where(‘post_group_id’, 1)->groupBy(‘user_id’)->get();
0 голосов
/ 06 мая 2018

Из вашего описания вы уже подготовили список Users заранее, так что вы найдете Posts только с Comment из этих конкретных пользователей.

По сути, вы хотите использовать whereHas($relation, $calback) для выполнения описанных вами проверок:

$userIds = [2, 3, 5, 7, 11, 13, 17]; // or query them...
$postId = 123; // the id of the post where we want to look through the comments

User::where('id', '<>', Auth::id())
    ->whereIn('id', $userIds)
    ->whereHas('comments', function ($query) use ($postId) {
        $query->where('post_group_id', $postId);
    })
    ->get();

Это просто проверит, написал ли пользователь Comment для данного поста. Поскольку вы забыли опубликовать свою модель User, я предположил, что для comments пользователя существует отношение.

Вы также можете объединить первые два условия (пользователь в списке, но не проверенный), если хотите. $userIds = array_diff($userId, [Auth::id()]) делает работу. where('id', '<>', Auth::id()) может быть исключено из запроса.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...