Laravel 5.3 возвращает результат, только если другой строки в той же таблице не существует - PullRequest
0 голосов
/ 14 сентября 2018

В основном у меня есть таблица подписчиков, в которой хранятся user_id и followable_id.Например, если пользователь A следует за пользователем B, создается запись.И если B следует за A, то создается новая запись.Мне нужно возвращать результат только в том случае, если A следует за B, но если B также следует за A, то ничего не возвращать.

Я пробовал различные решения, но они не работали.Может быть, кто-то мог бы указать мне правильное направление, спасибо.

РЕДАКТИРОВАТЬ: Это работает, однако это уродливо хакерской, и я хочу избежать этого:

$iFollows = Followers::where('user_id', '=', $currentUser->id)->get();
$myFollowers = Followers::where('followable_id', '=', $currentUser->id)->get();


    foreach($myFollowers as $key => $value){

        foreach($iFollows as $iFollow){

            if($value->user_id == $iFollow->followable_id){
                $myFollowers->forget($key);
            }
        }
    }

Структура базы данных:

enter image description here

Есть ли способ достичь того же, но с помощью построителя запросов laravel?

Пользователь реализует черту Followable

trait Followable
{
    /**
     * Collection of followers attached to this object
     *
     * @return Query|Collection
     */
    public function followers()
    {
        return $this->morphToMany(
            User::class,        // related
            'followable',       // name
            'followers',      // table
            'followable_id',    // foreignKey
            'user_id'           // otherKey
        )->where('status', 1)->withPivot('created_at', 'updated_at');
    }

    /**
     * @return mixed
     */
    public function followings()
    {
        return $this->morphToMany(
            User::class,        // related
            'followable',       // name
            'followers',      // table
            'user_id',    // foreignKey
            'followable_id'           // otherKey
        )->where('status', 1)->withPivot('created_at', 'updated_at');
    }

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Хорошо, я наконец решил свою проблему с помощью этого метода:

/**
 * Class FollowableTrait
 * @package App\Traits
 */
trait Followable
{
    /**
     * @param  array $ids 
     * @return mixed
     */
    public function newFollowers($ids)
    {
        return $this->morphToMany(
            User::class,        // related
            'followable',       // name
            'followers',      // table
            'followable_id',    // foreignKey
            'user_id'           // otherKey
        )->where('status', 1)->whereNotIn('user_id', $ids)->withPivot('created_at', 'updated_at');;
    }

Тогда в моем контроллере:

$ids = $currentUser->followings()->pluck('followable_id')->toArray();
$newFollowers = $currentUser->newFollowers($ids)->get();
0 голосов
/ 14 сентября 2018

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

У меня есть один запрос, чтобы получить то, что вы ищете, получитьвсе подписчики, которые не следуют за вами назад:

$myFollowers = Followers::selectRaw('followers.*')
    ->leftJoin('followers AS followers2', 'followers.user_id', '=', 'followers2.followable_id')
    ->where('followers.followable_id', '=', $currentUser->id)
    ->whereNull('followers2.id')
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...